0

好的,假设我有一些随机的抽象基类Base,并且我有一个Foo包含指向该基类的指针作为数据成员的类。所以

class Foo
{
    public:
        Foo(Base*);

    private:
        Base* ptr;
}

现在我使用指向基类的指针的原因是因为我希望能够选择我的Foo对象具有指向哪个派生类。现在,对我来说,棘手的部分是Foo.

如果我这样做

Foo::Foo(Base* _ptr)
{
    Foo::ptr = _ptr;
};

用户可以调整指向的对象,Foo::ptr因为_ptr在构造函数完成后仍然存在。我无法使_ptr常量指向的对象,因为Foo::ptr需要定期更新自身。现在我正在考虑_ptr = NULL在构造函数的末尾添加一行,但这也可能很危险,因为用户可以尝试取消引用_ptr.

我能想到的唯一方法是复制所指向的对象_ptr并初始化Foo::ptr该副本的地址。但是然后指向的对象_ptr需要有一个成员函数Clone()或类似的东西,因为我不能为一个我在编译时不知道类的对象调用复制构造函数。

那么如果没有的话,有什么优雅的方法可以做到这一点Clone()吗?或者这真的是唯一的可能性吗?

4

2 回答 2

0

另一种方法是使用智能指针。这样,所有权被分配给智能指针实现。

于 2012-05-03T19:33:32.940 回答
0

从 a 构造unique_ptr。这样,您的用户在创建Foo对象后将无法访问指针(除非他真的想要并使用get)。

例如

#include <memory>
struct Bar {};

struct Foo {
  Foo(std::unique_ptr<Bar>&& ptr) : ptr_(std::move(ptr)) {}
  std::unique_ptr<Bar> ptr_;
};

int main()
{
  std::unique_ptr<Bar> tt(new Bar());
  Foo f(std::move(tt));

  return 0;
}
于 2012-05-03T19:33:44.410 回答