避免使用禁用的复制构造函数进行隐式复制

时间:2012-01-22 17:52:46

标签: c++ copy-constructor

假设您有一个NonCopyable类

class NonCopyable
{
public:
   NonCopyable(int n){}
   ~NonCopyable(){}
   [...]

private:
   [members...]

private:
   NonCopyable( const NonCopyable& ); //disabled (no definition)
   NonCopyable& operator= ( const NonCopyable& ); //disabled (no definition)
};

对于这个类,拥有它的副本是不合逻辑的,因此复制构造函数和赋值运算符被禁用。

但是,当您需要NonCopyables对象的矢量时:

std::vector<NonCopyable> m_V;
int n;
m_V.push_back(NonCopyable(n));

在这里,您隐式调用了复制构造函数。

我已经被教导通过使用指向这些对象的指针而不是对象本身来解决这个问题。但这在使用和性能方面都很烦人,因为你必须使用new()...

动态分配这些对象

我的问题: 有没有解决的办法?什么是这个问题的常见解决方案?

2 个答案:

答案 0 :(得分:4)

C ++ 11有一个适用于许多不可复制类的解决方案:使类可移动(而不是可复制),并使用emplace_back向向量添加新元素。

如果你需要用C ++ 03来捏造某些东西,也许你可以找到一种方法来实现“空”NonCopyable对象的复制(并使用Luchian的限制这个操作的想法),并找到一种方法来实现{{ 1}}。然后你可以这样做:

swap

答案 1 :(得分:1)

您可以让vector成为班上的朋友:

class NonCopyable
{
   friend std::vector<NonCopyable>;
public:
   NonCopyable(int n){}
   ~NonCopyable(){}

private:
   NonCopyable( const NonCopyable& ) {}; 
   NonCopyable& operator= ( const NonCopyable& ) {}; 
};

或者您可以拥有vector智能指针。

编辑:

我可能误解了这个问题。如果您不想要该类的副本(我最初的猜测是您不希望将副本公开访问),您应该定义使用智能指针。