Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中禁用复制构造函数+;以及对象的使用_C++ - Fatal编程技术网

C++ 在c+中禁用复制构造函数+;以及对象的使用

C++ 在c+中禁用复制构造函数+;以及对象的使用,c++,C++,使用以下代码: #include <iostream> class A { public: A(int truc) : truc(truc) {} A(const A & other) = delete; private: int truc; }; class B { public: B(int machin, A a) : machin(machin), a(a) {} p

使用以下代码:

#include <iostream>


class A
{
    public:
        A(int truc) : truc(truc) {}
        A(const A & other) = delete;
    private:
        int truc;
};

class B
{
    public:
        B(int machin, A a) : machin(machin), a(a) {}
    private:
        int machin;
        A a;
};

int main()
{
  A a(10);      
  B b(2,a);
  return 0;
}
#包括
甲级
{
公众:
(国际贸易):贸易(贸易){}
A(常数A和其他)=删除;
私人:
国际贸易;
};
B类
{
公众:
B(intmachin,aa):machin(machin),A(A){}
私人:
内特机械;
A A;
};
int main()
{
A(10);
B(2,a);
返回0;
}
我得到一个编译错误“error:use of deleted function'a::a(const a&)”


如果我仍然希望类A不能被复制,我该如何解决这个问题呢?

B
的构造函数按值获取类型为
A
的对象->创建新对象(复制)

通过引用传递不会创建新对象(副本)

此外,这意味着您不能将其作为对象
A
存储在
B
中,因为这同样会创建新对象(副本),您必须将其存储为引用

这可能会导致一些问题:

B* createNewObject()
{
   A a(...); //local object is created
   B* ptr = new B(...,a); // reference in B now refers to local object
}// However, here is local object destroyed, so reference in B is now invalid (dangling reference)

int main()
{
   B *pb = createNewObject();
   //Any operation on B working with that invalid reference causes UNDEFINED BEHAVIOUR
}

另外,请记住,
a
中的任何更改也会更改您传递的对象(因为该引用引用引用了您传递的相同对象)。

B::B(int machin,a)
中按值获取
a
是主要问题,请执行
B::B(int machin,a&a)
B::B(int machin,const a&a)
。 这同样适用于构造函数主体中字段的赋值。因此,类
B
中的字段声明应该是
A&A或<代码>常数A&A,分别为

但是,您可能还希望删除赋值运算符:
A&operator=(const A&)=delete

看看boost


它的实现还取决于C++11是否可用:

考虑到复制的替代方案正在移动,您需要:

   B(int machin, A&& a) : machin(machin), a(a) {}

正确地禁止
A(10);B(2,a)
a
的副本。您现在需要
std::move(a)
到那里。

B
仍然有一个默认生成的复制构造函数。也许可以存储对原始对象的引用,这样您就不需要将其复制到B中了?您希望发生什么?您已经禁用复制,然后尝试复制。我只是发现C++世界和价值和引用的概念……我不需要整个提升,因为只有一个不可复制的类XD。它仍然不起作用,我仍然会有一个错误:使用删除函数A::(const a &)“@user65490:已完成回答-对具有值类型的字段的赋值也要求该类型可复制。非常感谢您的解释<代码>B::B(int-machin,A&&A):A(std::move(A))应该再次移动它,对吗?否则,它将尝试调用复制构造函数。
B* createNewObject()
{
   A a(...); //local object is created
   B* ptr = new B(...,a); // reference in B now refers to local object
}// However, here is local object destroyed, so reference in B is now invalid (dangling reference)

int main()
{
   B *pb = createNewObject();
   //Any operation on B working with that invalid reference causes UNDEFINED BEHAVIOUR
}
   B(int machin, A&& a) : machin(machin), a(a) {}