返回智能指针并为其分配值不起作用
Returning a smart pointer and assign it a value doesn't work
我在修改类函数返回的智能指针的内容时遇到了一些问题。返回对指针的引用将是一个解决方案,但我担心这是一个不好的做法。
这是我的代码:
#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_才改变它的值?
bar()返回shared_ptr
的副本。
所以赋值给那个副本并不会改变原来的shared_ptr
。
要使它像预期的那样工作,您应该返回对内部指针的引用:
std::shared_ptr<int>& bar()
{
return ptr_;
}
因为在前两种情况下,您只更改返回的副本。在第三种情况下,更改指针实际指向的内容。
如果您希望前两种情况正常工作,则返回一个引用。
这是因为bar()
应该返回一个对共享指针的引用,以便做你所期望的:
std::shared_ptr<int>& bar()
因为前两种情况是对bar()返回的temp使用赋值操作符,有效地将其从Foo中分离出来。在最后一种情况下,解引用允许对共享负载进行直接更改。