我想公开隐藏复制构造函数和赋值运算符。
此外,我想提供clone()
。
是否可以将复制构造函数和赋值运算符标记为protected
或private
并在克隆函数中使用它们?
也许某种使用条款。
原因是该类包含一些数据和一个唯一的id,应该随每个实例递增。因此,复制将使用默认赋值运算符,然后更改ID。我想避免手工复制每个成员的必要性,以避免在成员被添加到课堂时忘记添加一个成员。
答案 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
在技术上提供了一个用户定义的赋值运算符和复制构造函数,只是你要用相同的函数替换它们。编译器会隐式生成。这与显式编写它们具有相同的效果 - 即阻止自动生成移动赋值和移动构造函数。