好的,我们假设我有一些随机的抽象基类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()
,有没有优雅的方法呢?或者这真的是唯一的可能性吗?
答案 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;
}