隐藏自动生成的assignement运算符和复制构造函数而不替换它们

时间:2016-02-01 13:30:25

标签: c++

我想公开隐藏复制构造函数和赋值运算符。

此外,我想提供clone()

是否可以将复制构造函数和赋值运算符标记为protectedprivate并在克隆函数中使用它们?

也许某种使用条款。

原因是该类包含一些数据和一个唯一的id,应该随每个实例递增。因此,复制将使用默认赋值运算符,然后更改ID。我想避免手工复制每个成员的必要性,以避免在成员被添加到课堂时忘记添加一个成员。

3 个答案:

答案 0 :(得分:3)

你可以这样做:

class MyClass {
      MyClass(const MyClass&) = default;
      MyClass& operator=(const MyClass&) = default;
};

答案 1 :(得分:1)

由于如果c ++ 11可用,πάνταῥεῖ的答案将是最有利的,我通过使用管理id的{​​{3}}对象计数器来解决问题。

此类实现计数器并重新实现copy c'tor和赋值运算符,以便可以创建和使用子类的默认值而无危险。

template <class T>
class UidProvider
{
public:
  UidProvider()
  {m_id = getNewUId();}

  UidProvider(const UidProvider&)
  {m_id = getNewUId();}

  UidProvider& operator= (const UidProvider&)
  {m_id = getNewUId();}

  uint32 id()
  {return m_id;}

private:
  uint32 m_id;

  static uint32 getNewUId(){ return ++sm_id;}
  static uint32 sm_id;
};

class MyClass : public UidProvider<MyClass >{
 // ...
}

// in cpp
uint32 UidProvider<MyClass >::sm_id = 0;

答案 2 :(得分:0)

  

隐藏自动生成的分配运算符和复制构造函数而不替换它们

要迂腐,不可能。

在c ++ 03中绝对不可能。

在c ++ 11中,将它们定义为=default 在技术上提供了一个用户定义的赋值运算符和复制构造函数,只是你要用相同的函数替换它们。编译器会隐式生成。这与显式编写它们具有相同的效果 - 即阻止自动生成移动赋值和移动构造函数。