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

Pointer to object as argument of a constructor

本文关键字:对象 指针 参数 构造函数      更新时间:2023-10-16

好的,假设我有一些随机的抽象基类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(),有什么优雅的方法可以做到这一点吗?或者这真的是唯一的可能性?

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

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