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) {}