访问头文件 C++ [复制] 中的数组

Access array in header file C++ [duplicate]

提问人:Robert Michael Watson 提问时间:9/5/2022 最后编辑:Vlad from MoscowRobert Michael Watson 更新时间:9/5/2022 访问量:129

问:

我有一个对象房间,每个房间都有 4 个对其他房间的引用

头文件:

namespace test
{
    class Room
    {
    public:
        Room* references[4];
        void Connect(Room roomReference) const;
    }
}

在我的 cpp 文件中,我试图通过在引用中插入指向特定索引的房间指针来附加该引用。但是,我收到以下编译器错误“无法分配给只读类型 Room* const”。但是当我创建一个相同类型的局部变量并插入其中时,它就可以工作了。

void Room::Connect(Room roomReference) const
{
    Room* roomReferenceItem = &roomReference;
    Room* foos[4];
    // This works
    foos[2] = roomReferenceItem;

    // This does not
    this->references[2] = roomReferenceItem;
}

我不确定我对C++中的全局数组是否存在一些误解

C++ 常量 按引用传递 成员函数

评论

3赞 Retired Ninja 9/5/2022
两个问题,就是它不能修改成员变量。 是一个局部变量,当函数退出时,它将被销毁,留下一个指向无效对象的悬空指针。ConnectconstroomReference

答:

5赞 Vlad from Moscow 9/5/2022 #1

您声明了一个常量成员函数

void Connect(Room roomReference) const;

因此,您不能更改类的数据成员,因为在这种情况下,指针的定义类似于 。thisconst Room *

从函数声明中删除限定符。const

此外,您必须通过引用函数来传递该类型的对象,例如Room

void Connect(Room &roomReference);

否则,存储在数组中的指针将无效,因为它们将在退出函数后指向非活动的临时对象。references

评论

0赞 Robert Michael Watson 9/5/2022
我的救命恩人!我花了太多时间在这上面。谢谢!
0赞 john 9/5/2022
@RobertMichaelWatson 我想知道的是,为什么你首先将函数声明为 const。通常,我们看到初学者没有将本应是 const 的函数声明为 const,而不是相反。
0赞 Robert Michael Watson 9/6/2022
哈哈咕噜咕噜的问题。实际上是 Resharper for C++ 建议我切换它
2赞 Pete Becker 9/5/2022 #2

数组不是全局的,但这不是问题所在。 ,因此无法修改 的内容。所以去掉.然后问题是,当函数返回时,该对象将消失,因此存储指向它的指针不会完成任何好事。将其更改为 。Room::ConnectconstreferencesconstroomReferenceRoom& roomReference