在 C++ 中禁用复制构造函数并使用对象
disabling copy constructor in c++ and use of an Object
使用以下代码:
#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(const A&)"
如果我仍然希望类 A 无法被复制,我该如何绕过这个问题?
按
B::B(int machin, A a)
中的值获取A
是主要问题,请B::B(int machin, A& a)
或B::B(int machin, const A& a)
。这同样适用于构造函数主体中字段的赋值。因此,类B
中的字段声明应分别A& a;
或const A& a;
。
但是,您可能还希望删除赋值运算符:A& operator=( const A& ) = delete;
看看提升不可复制。
它的实现还取决于 C++11 是否可用:http://www.boost.org/doc/libs/1_60_0/boost/core/noncopyable.hpp
考虑到复制的替代方法是移动,您需要:
B(int machin, A&& a) : machin(machin), a(a) {}
这正确地不允许A a(10); B b(2,a);
这是a
的副本。你现在需要那里std::move(a)
。
B
的构造函数按值获取类型为 A
的对象 ->创建新对象(副本)
B(...,A a) ...
^^^^ pass by value
通过引用传递不会创建新对象(副本)。
B(...,A &a)...
^^^^^ pass by reference -> no copy
此外,这意味着您不能将其作为对象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
的任何更改也会更改您传递的对象(因为该引用引用您传递的同一对象)。
相关文章:
- 类中的 Arduino 对象构造函数设置垃圾值
- 编译错误:临时对象构造函数中缺少参数
- 双指针在使用 new 时不调用对象构造函数
- 以支持继承的方式将自身shared_ptr添加到对象构造函数中的向量中
- 在创建对象向量时,不为每个对象唯一调用默认对象构造函数
- GCC __attribute__((constructor)) 在对象构造函数之前调用
- 自定义对象构造函数在循环外部循环
- 从全局对象构造函数停止监视器计时器
- Arduino 上的 Sketch 停止在对象构造函数中执行
- 通过在引用线程对象来传递取消引用的“this”指针来在函数对象构造函数中创建线程是好是坏
- 为什么当对象构造函数投入新表达式时,为什么不调用DealLocation函数
- 临时结构对象构造函数奇数调用
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 为什么 Clang++ 不在另一个静态库中运行全局对象构造函数?
- 在未加载上下文的情况下在对象构造函数中使用OpenGL函数
- 为什么我们需要一个用户提供的const对象构造函数
- 对象构造函数的C++数组
- 将子结构值设置为对象构造函数中安全的纯虚拟函数返回的值
- C等价于新对象(构造函数)
- C++:直接在参数列表中使用数组文字的对象构造函数