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);