make_shared 在 setter 方法中的行为类似于创建副本
make_shared inside a setter method behaves like creating a copy
我正在尝试在我的 class 中使用智能指针,但是,我不知道为什么,我无法让它工作。这是我的 class:
的简化版本
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
本身一样。为什么我会看到这种行为?
"problem"与您使用make_shared
有关。该效用函数 不是 用于用共享指针包装普通指针 - 它用于 constructing a new object and returning a (shared) pointer to it.
但这并不是真正的问题,因为您不能通过传递对对象的 const 引用来转移对象的所有权。因此,您的 class' 界面从一开始就有问题 - 它不适合 Part
.
的共享所有权
要完成您(似乎)想要的事情,您可能需要 setter 方法类似于:
void setPart(const std::shared_ptr<Part>& part);
因此调用 setPart()
的每个实例都会获得 相同的 共享指针(或其副本),并且不会创建自己的。
注意:在某些情况下,按值传递它可能有意义:
void setPart(std::shared_ptr<Part> part);
我正在尝试在我的 class 中使用智能指针,但是,我不知道为什么,我无法让它工作。这是我的 class:
的简化版本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
本身一样。为什么我会看到这种行为?
"problem"与您使用make_shared
有关。该效用函数 不是 用于用共享指针包装普通指针 - 它用于 constructing a new object and returning a (shared) pointer to it.
但这并不是真正的问题,因为您不能通过传递对对象的 const 引用来转移对象的所有权。因此,您的 class' 界面从一开始就有问题 - 它不适合 Part
.
要完成您(似乎)想要的事情,您可能需要 setter 方法类似于:
void setPart(const std::shared_ptr<Part>& part);
因此调用 setPart()
的每个实例都会获得 相同的 共享指针(或其副本),并且不会创建自己的。
注意:在某些情况下,按值传递它可能有意义:
void setPart(std::shared_ptr<Part> part);