我是C ++的新手,我想知道重建/重新初始化对象的最佳方法是什么?我的最小代码如下所示:
typedef boost::shared_ptr<Object> PObject;
int main()
{
PObject SomeObject;
SomeObject = PObject(new Object);
// some code
*SomeObject = Object();
}
我觉得这不是正确的做法。有人能告诉我最好的方法吗?我只是想知道如何重建/重新初始化一个对象。谢谢!
答案 0 :(得分:5)
使用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"
,它将被销毁。
举例说明:
{{1}}
答案 1 :(得分:2)
你真的想做什么?
SomeObject = new Object
。如果您愿意,可以显式重置共享指针,以清除旧对象被删除。[1]警告:如果对象成员本身就是智能指针,这是非常重要的,编译器生成的assignemnt操作符通常不会做你想要的。它将创建一个“浅”副本:两个对象,但所有智能指针都指向相同的对象,这意味着如果一个更改,另一个也会改变。
最好的方法是使用“reset”函数编写对象,将所有字段设置为干净状态,然后(a)在构造函数中使用该函数,(b)在此时调用该函数。如果你不想这样做,创建一个新的游戏对象更有可能是你想要的,但是无论哪种方式都是正确的,即使它们在概念上非常不同,也可以在这里工作。
答案 2 :(得分:0)
这取决于你真正想要实现的目标。
您显示的代码将更改所有客户端通过shared_ptr
指向的值。如果这就是你想要做的,你的方式就是好的。
如果您想为一个客户端获取新对象。 shared_ptr::reset
是正确的做法。
但是,在C ++中,值通常比共享对象更受欢迎。除非有充分理由真正使用免费商店,否则不要这样做。
答案 3 :(得分:0)
如果要重新初始化对象,您正在做的是正确的事情。您正在使用SomeObject指向的原始对象调用赋值运算符,并使用默认构造函数创建临时Object。