指向作为构造函数参数的对象的指针
Pointer to object as argument of a 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()
或类似的东西,因为我无法为我在编译时不知道类的对象调用复制构造函数。
那么,如果没有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;
}
另一种方法是使用智能指针。这样,所有权就分配给智能指针实现。
相关文章:
- 对象指针在c++中是如何工作的
- C++ 对象指针数组的复制构造函数
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 正确初始化和销毁对象指针的C++数组?
- 如何深度复制链表对象指针
- 对象指针 c++ 的全局向量错误
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 静态对象指针
- 正在将对象指针数组初始化为NULL
- 如何使用条件表达式返回对象指针?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 使用C对象指针构建PyObject*
- 如何在使用对象指针时访问成员函数
- 静态强制转换允许转换对象指针,但不允许转换整数
- C++ abort() 在函数内的抽象类对象指针调用上
- 指向函数的对象指针
- 访问指向对象指针向量的指针的第一个元素?
- 如何将对象/指针正确存储到 Qlist 中
- 对象指针打印结果以相反的顺序进行