通过智能指针重置对象
Resetting an object through smart pointer
我是c++的新手,我想知道重构/重新初始化对象的最佳方法是什么?我的最小代码是这样的:
typedef boost::shared_ptr<Object> PObject;
int main()
{
PObject SomeObject;
SomeObject = PObject(new Object);
// some code
*SomeObject = Object();
}
我觉得那样做不对。谁能告诉我做这件事的最好方法?我只是想知道如何重建/重新初始化一个对象。谢谢! 当使用shared_ptr
时,您可以使用reset
-方法:
SomeObject.reset(new Object);
或者,异常安全的替代方法(也应该用于初始化):
SomeObject = make_shared<Object>();
这两个语句使得shared_ptr
指向一个新创建的Object
。引用同一对象的其他shared_ptr
不会受到影响。如果这个shared_ptr
是唯一指向旧对象的,它将被销毁。
shared_ptr<int> foo = make_shared<int>(23);
shared_ptr<int> bar = foo;
std::cout << *foo << ", " << *bar << std::endl; // prints "23, 23"
*foo = 42;
std::cout << *foo << ", " << *bar << std::endl; // prints "42, 42"
bar = make_shared<int>(23);
std::cout << *foo << ", " << *bar << std::endl; // prints "42, 23"
你到底想做什么?
- 如果您想删除旧对象并从头创建一个新对象,由相同的指针指向,您可以执行
SomeObject = new Object
。如果您愿意,您可以显式重置共享指针,以明确旧对象已删除。 - 如果你想重置对象的内容,而不释放和重新分配它,那么,只要它有一个正确实现的赋值操作符[1],你给它赋一个默认构造的对象的习惯用法就可以工作
*PObject = Object()
[1]警告:如果对象成员本身是智能指针,编译器生成的赋值操作符通常不会按您的要求执行。它将创建一个"浅"复制:两个对象,但它们的所有智能指针将指向相同的对象,这意味着如果一个改变,另一个也会改变。
也许最好的方法是用一个"reset"函数来编写你的对象,它将所有字段设置为一个干净的状态,然后(a)在构造函数中使用该函数,(b)在此时调用该函数。如果你不想这样做,那么创造一个新的游戏对象更有可能是你想要的,但两种方法都是正确的,尽管它们在概念上非常不同,但两种方法都可行。这取决于您实际想要实现的目标。您所展示的代码将更改所有客户机通过shared_ptr
指向的值。如果那是你想做的,你的方法是好的。
如果您想为一个客户端获取一个新对象。shared_ptr::reset
是正确的做法。
然而,在c++中,值通常优于共享对象。除非有充分的理由使用免费商店,否则不要这样做。
如果您想要重新初始化对象,那么您正在做的是正确的事情。
相关文章:
- 对象指针在c++中是如何工作的
- C++ 对象指针数组的复制构造函数
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 正确初始化和销毁对象指针的C++数组?
- 如何深度复制链表对象指针
- 对象指针 c++ 的全局向量错误
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 静态对象指针
- 正在将对象指针数组初始化为NULL
- 如何使用条件表达式返回对象指针?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 使用C对象指针构建PyObject*
- 如何在使用对象指针时访问成员函数
- 静态强制转换允许转换对象指针,但不允许转换整数
- C++ abort() 在函数内的抽象类对象指针调用上
- 指向函数的对象指针
- 访问指向对象指针向量的指针的第一个元素?
- 如何将对象/指针正确存储到 Qlist 中
- 对象指针打印结果以相反的顺序进行