首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免使用禁用的复制构造函数进行隐式复制

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

Stack Overflow用户
提问于 2012-01-23 01:52:46
回答 2查看 359关注 0票数 2

假设您有一个类NonCopyable

代码语言:javascript
复制
class NonCopyable
{
public:
   NonCopyable(int n){}
   ~NonCopyable(){}
   [...]

private:
   [members...]

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

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

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

代码语言:javascript
复制
std::vector<NonCopyable> m_V;
int n;
m_V.push_back(NonCopyable(n));

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

我被教导通过使用指向这些对象的指针而不是对象本身来解决这个问题。但这在使用和性能上都很烦人,因为您必须使用new()动态分配这些对象……

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-23 02:00:10

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

如果你需要用C++03来虚构一些东西,也许你可以找到一种方法来实现“空的”NonCopyable对象的复制(并使用Luchian的限制该操作的想法),也可以找到一种实现swap的方法。然后您可以执行以下操作:

代码语言:javascript
复制
std::vector<NonCopyable> m_V;
int n;
m_V.push_back(NonCopyable());
NonCopyable(n).swap(m_V.back());
票数 4
EN

Stack Overflow用户

发布于 2012-01-23 01:57:29

您可以使vector成为该类的朋友:

代码语言:javascript
复制
class NonCopyable
{
   friend std::vector<NonCopyable>;
public:
   NonCopyable(int n){}
   ~NonCopyable(){}

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

或者,您可以有一个指向类的智能指针的vector

编辑:

我可能误解了这个问题。如果你不想要类的副本(我最初的猜测是你不想让副本公开),你应该明确地使用智能指针。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8963204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档