为返回的 shared_ptr 赋值并不符合预期

Assigning value to returned shared_ptr doesn't behave as expected

我有一个包含 shared_ptr<Room> 个对象的私有三维向量,如下所示:

private:
    vector<vector<vector<shared_ptr<Room>>>> world;

在同一个 class 中,我提供对 Room 个对象的访问:

public:
    shared_ptr<Room> room_at(const int & x, const int & y, const int & z) const
    {
        return world.at(x).at(y).at(z);
    }

同样在class中,我初始化了world结构:

for (int x = 0; x < C::WORLD_X_DIMENSION; ++x)
{
    vector<vector<shared_ptr<Room>>> row;
    for (int y = 0; y < C::WORLD_Y_DIMENSION; ++y)
    {
        vector<shared_ptr<Room>> vertical_stack; // "stack"
        for (int z = 0; z < C::WORLD_Z_DIMENSION; ++z)
        {
            vertical_stack.push_back(shared_ptr<Room>(nullptr));
        }
        row.push_back(vertical_stack);
    }
    world.push_back(row);
}

以后想存一个Room对象到world:

void add_room_to_world(const int & x, const int & y, const int & z)
{
    shared_ptr<Room> room = make_shared<Room>(); // create an empty room

    /* (populate room's member fields) */

    // add room to world
    room_at(x, y, z) = room; // This doesn't work as expected
}

world 中的 shared_ptr 如预期的那样开始为 nullptr,但在上面的最后一行没有改变。

根据我在 SO 上的发现,我尝试了 operator=(以上)、.reset(room)make_shared<Room>(room)(使用实际的 Room 对象而不是 shared_ptr<Room>) 但在所有情况下,world 中的 shared_ptr 保持设置为 nullptr.

将对象分配到 world 中的正确方法是什么?

room_at returns 一个值。当你改变这个值时,谁在乎呢?你只是在改变一些随机的临时变量。它对从中复制的对象没有意义。

为了支持您想要的内容,room_at 需要 return 一个可变引用 - 对于这种方式的 public API 来说,这是一个非常糟糕的主意。

您可能希望提供一个类似的私有方法,该方法 return 是可变引用,然后实现 room_at 只是 return 该函数引用的对象的副本.

room_at returns 一个值。当它从函数中被 returned 时,它被复制,因此您对 returned 值执行的任何操作都不会影响原始值。如果您想更改原始值,您必须 return 像这样的参考:

shared_ptr<Room>& room_at(const int & x, const int & y, const int & z) const
{
   return world.at(x).at(y).at(z);
}

如果您不希望 class 的用户能够执行此操作,请将此方法声明为私有并保持原样。