我试图在课堂上使用智能指针,但是,我不知道为什么,我无法使其发挥作用。这是我班级的简化版本:
class Project {
public:
std::shared_ptr<Part> getPart() const {
return m_part;
}
void setPart(const Part &part) {
m_part = std::make_shared<Part>(part);
}
private:
std::shared_ptr<Part> m_part;
};
问题是,如果我将Part
对象(让我们称之为some_part
)传递给setPart()
方法,并且在对some_part
进行更改后,属性m_part
保持不变,就像它指向副本而不是some_part
本身一样。为什么我会看到这种行为?
答案 0 :(得分:2)
&#34;问题&#34;是您使用make_shared
。该实用程序函数不旨在包含带有共享指针的普通指针 - 它用于constructing a new object and returning a (shared) pointer to it。
但这并不是一个真正的问题,因为你不能通过传递const引用来转移对象的所有权。所以你的班级&#39;界面开头有问题 - 它不适合Part
的共享所有权。
要做你想要的事情,你可能需要你的setter方法:
void setPart(const std::shared_ptr<Part>& part);
因此调用setPart()
的每个实例都会获得相同的共享指针(或其副本),并且不会自行创建。
注意:在某些情况下,按值传递它可能是有意义的:
void setPart(std::shared_ptr<Part> part);