3

在阅读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,但我仍然无法得到解决方案......任何人都可以帮助我,不胜感激。

4

6 回答 6

6

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

多个实例可以访问 a 的一种解决方案Unique_handle是持有指向它的指针,然后复制该指针。然后多个实例Y指向同一个唯一句柄。

但是,请注意在这种情况下正确管理资源。

于 2010-06-05T05:00:49.730 回答
4

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

该类故意使您的代码无法执行您尝试执行的操作(可能是因为该类无法正常运行或复制没有意义)。如果您希望能够复制该类的对象,则需要重新设计该类。

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

于 2010-06-05T05:45:05.967 回答
2

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

于 2010-06-05T05:01:30.743 回答
2

你不应该试图复制它。但是话虽如此......你可以memcpy它。您这样做的唯一原因是您知道自己在做什么,知道后果等等。它通常超出了通常可以接受的范围。但是你可能想做一些有点忍者的事情。

于 2010-06-05T05:07:11.050 回答
0

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

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

但是好像不对,那我怎么在外面定义这样的对象呢?

不管怎样,谢谢大家的关心。

于 2010-06-05T08:40:37.470 回答
0

您可以使用 ashared_ptr来共享对象:

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

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

就这么简单。

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

于 2010-06-05T10:17:59.057 回答