2

如何在创建单例时像在 Java 中那样使不可克隆。

我们是否可以在复制构造函数上设置任何条件,以便在用户尝试复制对象时抛出异常?

我是 C++ 的新手,因此请在其中添加任何信息,或者如果已经有相同的答案,请重定向。

4

4 回答 4

7

只需声明复制构造函数和复制赋值运算符私有

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;
};
于 2013-07-04T11:09:13.027 回答
5

您可以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++中,classstruct本质上是一样的。

于 2013-07-04T11:06:20.953 回答
3

将复制语义声明为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

这也应该有效!

于 2013-07-04T11:07:54.543 回答
2

是否可以在复制构造函数上设置任何条件,以便在用户尝试复制对象时引发异常。

如果您将复制构造函数设为私有,则当程序员尝试制作另一个副本时,代码将无法编译。这可能比在运行时检测带有异常的错误要好。

class foo {
    private:
         operator = ( const foo& f);
};
于 2013-07-04T11:08:57.040 回答