如何使用其复制构造函数和复制赋值是私有的对象?

时间:2010-06-05 04:57:10

标签: c++ private-methods private-constructor

在阅读 TCPL 时,我遇到了一个问题,正如标题所说,然后'私人'类是:

class Unique_handle {
private:
    Unique_handle& operator=(const Unique_handle &rhs);
    Unique_handle(const Unique_handle &rhs);
public:
    //...
};

使用代码是:

struct Y {
    //...
    Unique_handle obj;
};

我想执行这样的操作:

int main()
{
    Y y1;
    Y y2 = y1;
}

虽然,这些代码来自TCPL,但我仍然无法得到解决方案...... 可以有人帮助我,欣赏。

6 个答案:

答案 0 :(得分:6)

顾名思义,Unique_handle并不意味着要复制。它的实现通过禁用复制构造函数和复制赋值运算符来确保它。

有权访问Unique_handle的多个实例的一个解决方案是持有指向它的指针,并复制指针。然后,Y的多个实例指向相同的唯一句柄。

但是,

小心,以便在这种情况下正确管理资源。

答案 1 :(得分:4)

你在Stroustrup的书中看到的例子是演示类的设计者如何明确地防止复制或分配该类的对象。

该课程是故意制作的,所以你的代码不能做你想做的事情(大概是因为课程不能正常运作或者复制其他方面没有意义)。如果您希望能够复制该类的对象,则需要重新设计该类。

您可能拥有的其他一些选项(也可能没有意义,但这取决于您的实际操作) - 传递指向对象引用的指针而不是复制。

答案 2 :(得分:2)

通常,使复制构造函数和赋值运算符私有(并且未实现)的习惯用法意味着该类的原始作者特别不希望此对象可复制。

答案 3 :(得分:2)

你不应该试图复制它。但是说了......你可以记住它。你做这件事的唯一理由就是你知道你在做什么,你知道后果等等。它通常是走出了什么样的界限,一般都是可以接受的。但你可能想做一些忍者。

答案 4 :(得分:0)

我搜索了我的问题,并找到了构建这样一个对象的方法:

static Unique_handle * instance(){return new Unique_handle(); }

但似乎错了,那我怎么能在外面定义这样的对象?

无论如何,谢谢你的所有关注。

答案 5 :(得分:0)

您可以使用shared_ptr分享对象:

class Y
{
public:
  Y(): mHandle(new UniqueHandle()) {}

private:
  boost::shared_ptr<UniqueHandle> mHandle;
};

就这么简单。

如果您不想要共享所有权,可以使用boost::scoped_ptr或新创建的std::unique_ptr(如果您有权访问它),然后自己实现CopyConstructor和AssignmentOperator,处理它们的语义