如何使C++类生成不可克隆的对象

How to make a C++ class produce non cloneable objects

本文关键字:对象 何使 C++      更新时间:2023-10-16

如何使不可克隆,就像我们在Java中创建singleton时所做的那样。

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

我是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++中,classstruct本质上是相同的。

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