2

我在修改类函数返回的智能指针的内容时遇到了一些问题。返回对指针的引用将是一种解决方案,但我担心这是一种不好的做法。

这是我的代码:

#include <memory>
#include <iostream>

class Foo
{
public:
    Foo() : ptr_(new int(5)) {};
    ~Foo() {};

    std::shared_ptr<int> bar()
    {
        return ptr_;
    }

    void print()
    {
        std::cout << *ptr_ << std::endl;
    }

private:
    std::shared_ptr<int> ptr_;
};

int main()
{
    Foo f;
    f.print();

    // First case
    f.bar() = std::make_shared<int>(23);
    f.print();

    // Second case
    f.bar().reset(new int(23));
    f.print();

    // Third case
    *f.bar() = 23;
    f.print();

    return 0;
}

这是输出:

5
5
5
23

为什么只有在第三种情况下 ptr_ 才改变它的值?

4

4 回答 4

3

bar()返回shared_ptr.
因此,分配给该副本不会更改原始shared_ptr.

要使其按预期工作,您应该返回对内部指针的引用:

std::shared_ptr<int>& bar()
{
   return ptr_;
}
于 2013-04-29T13:10:28.200 回答
1

因为在前两种情况下,您只更改返回的副本。在第三种情况下,您更改指针实际指向的内容。

如果您希望前两种情况起作用,请改为返回参考。

于 2013-04-29T13:10:03.810 回答
1

这是因为bar()应该返回对共享指针的引用以执行您期望的操作:

 std::shared_ptr<int>& bar()
于 2013-04-29T13:10:50.407 回答
1

因为前两种情况是在 bar() 返回的 temp 上使用赋值运算符,因此有效地将其从 Foo 中分离出来。在最后一种情况下,取消引用允许对共享有效负载进行直接突变。

于 2013-04-29T13:14:48.333 回答