如何在创建单例时像在 Java 中那样使类不可克隆。
我们是否可以在复制构造函数上设置任何条件,以便在用户尝试复制对象时抛出异常?
我是 C++ 的新手,因此请在其中添加任何信息,或者如果已经有相同的答案,请重定向。
如何在创建单例时像在 Java 中那样使类不可克隆。
我们是否可以在复制构造函数上设置任何条件,以便在用户尝试复制对象时抛出异常?
我是 C++ 的新手,因此请在其中添加任何信息,或者如果已经有相同的答案,请重定向。
只需声明复制构造函数和复制赋值运算符私有
在C++03中
class NonCopyable
{
public:
NonCopyable() { }
private:
NonCopyable(const NonCopyable&);
NonCopyable& operator=(const NonCopyable&);
};
您也可以从 NonCopyable 派生一个类,AnotherType 是不可复制的
class AnotherNonCopyable : private NonCopyable
{
public:
AnotherNonCopyable () {}
}
使用C++11:
class NonCopyableType
{
public:
NonCopyableType(const NonCopyableType&) = delete;
NonCopyableType& operator=(const NonCopyableType&) = delete;
};
您可以delete
复制构造函数和赋值运算符:
struct Foo
{
Foo(const& Foo) = delete;
Foo& operator=(const Foo&) = delete;
};
如果您没有 C++11 支持,请将它们设为私有,并且不要实现它们:
struct Foo
{
private:
Foo(const& Foo);
Foo& operator=(const Foo&);
};
注意在C++中,class
和struct
本质上是一样的。
将复制语义声明为delete
:
//C++11 only
MyClass(MyClass const &) = delete;
MyClass& operator=(MyClass const &) = delete;
这使得类不可复制!
//pre-C++11 code
private:
MyClass(MyClass const &); //declare only, don't define it
MyClass& operator=(MyClass const &); //declare only, don't define it
这也应该有效!
是否可以在复制构造函数上设置任何条件,以便在用户尝试复制对象时引发异常。
如果您将复制构造函数设为私有,则当程序员尝试制作另一个副本时,代码将无法编译。这可能比在运行时检测带有异常的错误要好。
class foo {
private:
operator = ( const foo& f);
};