gpt4 book ai didi

c++ - 将对象附加到智能指针 vector 的最佳方法?

转载 作者:太空狗 更新时间:2023-10-29 19:47:32 29 4
gpt4 key购买 nike

考虑以下类:

class A {
public:
A() {};
protected:
int m1;
float m2;
// ...
}

class B {
public:
B() { };
void add1(std::shared_ptr<A> _obj) {
data.push_back(_obj);
};
void add2(A* _obj) {
data.push_back(_obj);
};
void add3(A& _obj) {
data.push_back(&_obj);
};
private:
std::vector<std::shared_ptr<A>> data;
}

B 中的哪些方法 addX 更适合/最佳实践将新指针传递到 vector 中?考虑到 data 是非常量智能指针的 vector ,我知道不可能通过 const 引用传递对象或智能指针而不必“de-const”它们,这是不可取的并认为是不好的做法。但是,除非我弄错了,否则所有这些方法最终都会实例化一个 shared_ptr 然后将其复制到 vector 中?它们之间有什么区别?

最佳答案

如果您想确保您的 API 明确表示被调用方将获得所有权,唯一可行的方法是 add1。它从签名中清楚地表明,无论您提供什么,都将由被叫方保留。

您可以使用 std::move.emplace_back 改进它:

void add1(std::shared_ptr<A> _obj) 
{
data.emplace_back(std::move(_obj));
}

add2 具有误导性,因为原始指针可能暗示也可能不暗示所有权。有人可以将指针传递给堆栈分配的变量。

add3 有同样的问题,但它更具误导性,因为非 const 引用通常用于就地改变对象,而不是获取对象的所有权.

关于c++ - 将对象附加到智能指针 vector 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57008295/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com