我如何使这个C ++对象不可复制?
看标题。
我有:
class Foo { private: Foo(); public: static Foo* create(); }
我需要从这里做什么来使Foo不可复制?
谢谢!
class Foo { private: Foo(); Foo( const Foo& other ); // non construction-copyable Foo& operator=( const Foo& ); // non copyable public: static Foo* create(); }
如果你使用boost,你也可以从noncopyableinheritance: http : //www.boost.org/doc/libs/1_41_0/boost/noncopyable.hpp
编辑:C + + 11版本,如果你有一个编译器支持这个function:
class Foo { private: Foo(); Foo( const Foo& other ) = delete; // non construction-copyable Foo& operator=( const Foo& ) = delete; // non copyable public: static Foo* create(); }
使复制构造函数和赋值运算符也是私有的。 只是声明就够了,你不必提供一个实现。
在那里添加一点。
如前所述,传统的解决scheme是Copy Constructor
和Assignment Operator
都声明为private
,而不是 定义它们。
- 因为他们是
private
,这将导致任何人尝试使用它们,没有访问类的私有部分的编译时错误 … - 在链接的时候 (如果你检查那些链接的时候 ),或者最有可能的是在运行时 (当试图加载库的时候),在
undefined symbol
的forms下,哪些朋友(和类本身) 。
当然,在第二种情况下,这是相当麻烦的,因为你不必指出错误发生的文件和行,所以你必须自己检查你的代码。 幸运的是,它只限于你的class级方法和朋友。
另外,值得注意的是,这些属性是inheritance和组合方式的传递:编译器只会生成Default Constructor
, Copy Constructor
, Assignment Operator
和Destructor
Copy Constructor
(如果可能的话)的默认版本。
这意味着,对于这四个中的任何一个, 只有当这个类的所有基础和属性都可以访问时,它们才会自动生成。
// What does boost::noncopyable looks like > class Uncopyable { public: Uncopyable() {} private: Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&); };
这就是为什么从这个类inheritance(或使用它作为一个属性)将有效地防止你自己的类是可复制或可分配的,除非你自己定义这些运算符。
一般而言,遗传select在那里的组合有两个原因:
- 该对象实际上是
Uncopyable
,即使多态性可能没有那么有用 - inheritance导致
EBO
或Empty Base Optimization
,而一个属性将是可寻址的,因此将占用内存(在每个类的实例中),即使它实际上不需要它,编译器有可能不添加这个开销类。
你也可以声明操作符是私有的,而不是在你自己的类中定义它们,但是代码会less一些自我logging ,你就不能自动search那些拥有这个属性的类(除非你有一个全面的parsing器)。
希望这可以揭示一下这个机制。
另一种方法是禁止复制构造函数,为方便起见,可以使用DISALLOW_COPY_AND_ASSIGNmacros:
// A macro to disallow the copy constructor and operator= functions // This should be used in the private: declarations for a class #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&) = delete; \ void operator=(const TypeName&) = delete
那么,在Foo类中:
class Foo { public: Foo(int f); ~Foo(); private: DISALLOW_COPY_AND_ASSIGN(Foo); };
参考谷歌样式表
#include <boost/utility.hpp> class Foo : boost::noncopyable {...
但正如斯科特·迈耶斯(Scott Meyers)曾经说过的那样:“这是一个很好的课堂,只是我觉得这个名字有点不合适,或者是非自然的”,或者类似的话。
在C ++ 11中,可以通过在声明后放置= delete
来显式地禁用默认复制和赋值构造函数的创build。
维基百科 :
struct NonCopyable { NonCopyable() = default; NonCopyable(const NonCopyable&) = delete; NonCopyable & operator=(const NonCopyable&) = delete; };
课程也是一样。
使C ++对象不可复制的典型方法是显式声明复制构造函数和复制赋值运算符,但不实现它们。 这将阻止编译器自行生成。 (通常这是与声明它们private
以便它生成一个编译错误,而不是链接器错误一起完成的。)
还有就是你可以inheritance的boost::noncopyable
类,这就是我上面描述的。
使复制构造函数私有。
Foo(const Foo& src);
你不需要实现它,只需在头文件中声明它。
这是我使用的:
/* Utility classes */ struct NoCopy { public: NoCopy() {} private: NoCopy(const NoCopy &); }; struct NoAssign { private: NoAssign &operator=(const NoAssign &); }; struct NonInstantiable { private: NonInstantiable(); }; struct NoCopyAssign : NoCopy, NoAssign { }; typedef NoCopyAssign NoAssignCopy;
在你的情况下:
struct Example : NoCopy { };