gpt4 book ai didi

C++ 只允许一个成员变量被设置一次

转载 作者:太空狗 更新时间:2023-10-29 23:20:42 24 4
gpt4 key购买 nike

我进入 C++ 已经有一段时间了,但我想确保在我进入 C++ 时坚持最佳实践,包括 const-correct。

我目前正在为游戏框架构建一个代码库,我有以下类(为简单起见进行了总结):

class Screen
{
public:
Clear();
}

class Game
{
private:
Screen* screen;

protected:
const Screen* GetScreen() const;
}

为简洁起见,我省略了其余部分,但足以说明,Game 类负责创建 Screen 类实例。创建后,只能通过 GetScreen() 方法访问。

我的想法是,当创建一个新游戏时,我将从这个基类继承,例如,在渲染循环期间我想清除屏幕以重绘下一帧。现在,在我上面的定义中,当使用 GetScreen() 方法时,不允许调用 Clear() 方法,因为它不是 const。 clear 方法实际上会改变类的内部工作(由于先前显示的图像被清除这一事实)所以这就是为什么我将 const 声明排除在定义之外的原因。如果我将它设为 const,那么我将不得不将 Screen 类的一些内部工作方式作为 mutable 但从我读过的内容来看, 这不是非常正确的。

所以,我的问题分为两个部分。我是否应该将 void Clear() 更改为 void Clear() const 并使部分内部工作方式可变

或者是另一种选择,它允许我使 Game 类的 screen 成员只能由 Game 类设置一次,所以我可以在程序运行的其余时间访问非常量成员函数。

感谢您的帮助。

最佳答案

因为 Game::screen 是私有(private)的,所以它不能被派生类访问。虽然 GetScreen() 的调用者可以访问 Screen 对象,但他不能修改 Game 存储的 screen > 指向。所以你对例如完全没问题提供这两个重载:

class Game
{
Screen *screen;

protected:
const Screen* GetScreen() const;
Screen* GetScreen();
};

它们都不允许派生类修改 screen 指针本身,因此它不能“重置”它以指向 Game 不希望它指向的地方。

关于C++ 只允许一个成员变量被设置一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16927304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com