我是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++中,值通常优于共享对象。除非有充分的理由使用免费商店,否则不要这样做。
如果您想要重新初始化对象,那么您正在做的是正确的事情。