假设您有一个类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()动态分配这些对象……
我的问题是:有没有办法解决这个问题?这个问题的常见解决方案是什么?
发布于 2012-01-23 02:00:10
C++11有一个适用于许多不可复制类的解决方案:使类可移动(而不是可复制),并使用emplace_back向向量添加新元素。
如果你需要用C++03来虚构一些东西,也许你可以找到一种方法来实现“空的”NonCopyable对象的复制(并使用Luchian的限制该操作的想法),也可以找到一种实现swap的方法。然后您可以执行以下操作:
std::vector<NonCopyable> m_V;
int n;
m_V.push_back(NonCopyable());
NonCopyable(n).swap(m_V.back());发布于 2012-01-23 01:57:29
您可以使vector成为该类的朋友:
class NonCopyable
{
friend std::vector<NonCopyable>;
public:
NonCopyable(int n){}
~NonCopyable(){}
private:
NonCopyable( const NonCopyable& ) {};
NonCopyable& operator= ( const NonCopyable& ) {};
};或者,您可以有一个指向类的智能指针的vector。
编辑:
我可能误解了这个问题。如果你不想要类的副本(我最初的猜测是你不想让副本公开),你应该明确地使用智能指针。
https://stackoverflow.com/questions/8963204
复制相似问题