指向对象的指针作为构造函数的参数

时间:2012-05-03 19:27:25

标签: c++ pointers constructor

好的,我们假设我有一些随机的抽象基类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()或类似的东西,因为我无法在编译时调用我不认识该类的对象的复制构造函数-time。

如果没有Clone(),有没有优雅的方法呢?或者这真的是唯一的可能性吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

e.g。

#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;
}