setter方法中的make_shared就像创建副本一样

时间:2018-03-04 21:05:07

标签: c++ oop c++11 pointers smart-pointers

我试图在课堂上使用智能指针,但是,我不知道为什么,我无法使其发挥作用。这是我班级的简化版本:

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本身一样。为什么我会看到这种行为?

1 个答案:

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