有效地改变子类中成员变量的常量

Effectively changing constness of member variable in subclass

本文关键字:变量 常量 成员 改变 子类 有效地      更新时间:2023-10-16

在开发一款游戏时,我设计了一个类,在正常操作中有一个const成员变量,如下所示:

class Foo {
    /* ... */
protected:
    const boost::unordered_map<short, short> m_map;
};

然而,在附带的游戏编辑器中,我想重用Foo类,但提供一种方法来编辑这个const成员,因为它用于渲染游戏(我想重用渲染器编辑器)。因此,我计划对Foo类进行子类化,以便提供用于更改各种属性的方法,以及序列化用于保存编辑器数据的数据。我想知道是否有一种优雅的方法来做到这一点,同时保持成员为const,或者是否有更好的设计?

目前我想到的选项有:

  • 删除const关键字,并简单地不提供用于更改变量的公共接口
  • 将渲染器更改为使用接口,并在Foo和Foo的编辑器版本中分别实现它
  • 重新实现Foo的公共接口,为Foo的编辑器版本使用一个新的可变映射
  • 完全是别的东西吗?

从语言的角度来看,接口路径似乎是最干净的,但是为每个涉及的类提供了一个接口(抽象基类),这是一个不错的努力。欢迎提出建议和意见。(注:我很难想出一个描述性的标题;

如果让你的变量非constprotected感觉太侵入,也许你可以设计一个变量非constprivate的设计,并提供protected成员函数来操作它,当你在第一个地方创建变量const时,你想到的任何约束。

它们是两个独立的项目/目标吗?有些人不喜欢过多地使用预处理器,但如果它们是分开编译的,那么我就会使用一个编译器标志来为游戏和编辑器分别构建一个方法:

#ifdef __EDITOR__
     boost::unordered_map<short, short> m_map;
#else
     const boost::unordered_map<short, short> m_map;
#endif

如果我没记错的话,对于GCC,你会想要-D __EDITOR__之类的东西,但是所有好的ide都会在项目设置中有一个字段,您可以在其中指定编译器标志。它为您节省了大量的重构或为您的代码库添加额外的复杂性。

我认为你的问题太牵强了。没有理由让两个类具有相同的功能。不要重复你说过的话。我建议创建一个带有可变属性的类,添加getter和setter,非必要时不要使用setter。