C++:转移到 unique_ptr

Lol*_*ola 3 c++ unique-ptr

我的问题是我是前端开发人员,但我需要向 C++ 项目添加更改。

那是怎么回事:

std::vector<myObject*> myArray;
...
myArray.push_back(new myObject);
...
myArray.back();
Run Code Online (Sandbox Code Playgroud)

我如何尝试改变它:

std::vector<std::unique_ptr<myObject>> myArray;
...
myArray.push_back(std::unique_ptr<myObject> (new myObject));
...
myArray.back().get(); // this place looks not good in my opinion :)
Run Code Online (Sandbox Code Playgroud)

很多功能应该得到myObject*。而且我不知道如果我改变函数的参数会有多少变化。

在这种情况下,您能否建议如何正确获取指针?

wal*_*nut 10

正如评论中提到的,你应该使用

myArray.push_back(std::make_unique<myObject>());
Run Code Online (Sandbox Code Playgroud)

(或emplace_back代替push_back)而不是newnew应尽可能避免直接使用。


你不应该叫.get()std::unqiue_ptr经常。

您可以使用以下命令获取对存储对象的引用*

auto& reference_to_object = *myArray.back();
Run Code Online (Sandbox Code Playgroud)

您可以通过->以下方式直接访问成员:

myArray.back()->some_function();
Run Code Online (Sandbox Code Playgroud)

只有当你需要一个非拥有的指针(它应该比引用少得多)你才需要调用.get()

auto ptr_to_object = myArray.back().get();
Run Code Online (Sandbox Code Playgroud)

或者你可以使用

auto ptr_to_object = &*myArray.back();
Run Code Online (Sandbox Code Playgroud)

为此(除非在operator&为 重载的极不可能的情况下myObject)。


我认为问题是正如你所说的“应该有很多功能myObject*”。这应该比你说的要少得多。只有也接受空指针作为参数的函数才应该将指针作为参数。否则应首选参考文献。前者不会经常发生。


另请注意,您确实应该有充分的理由在std::vector. 很少有理由不使用std::vector<myObject>,例如myObject不可移动、移动非常昂贵、myObject多态使用或在添加/删除元素时要求对所包含对象的引用不会失效。(尽管std::list在后一种情况下可能效果更好。)如果这些都没有,或者我忘记提及的其他原因,请申请,只需使用std::vector<myObject>.