关于c ++:有效地改变子类中成员变量的常量


Effectively changing constness of member variable in subclass

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

1
2
3
4
5
class Foo {
    /* ... */
protected:
    const boost::unordered_map<short, short> m_map;
};

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

我到目前为止提出的选项是:

  • 删除const关键字并且不提供用于更改变量的公共接口
  • 更改渲染器以使用接口并在Foo和Foo的编辑器版本中单独实现它
  • 重新实现Foo的公共接口,为Foo的编辑器版本使用新的可变映射
  • 还有别的吗?

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


如果你的变量非constprotected感觉过于侵入,也许你可以设计一个变量是非constprivate的设计,并提供protected成员函数来操纵它,无论你有什么限制当你首先创建变量const时,请记住。


它们是两个独立的项目/目标吗?有些人不喜欢这么多地使用预处理器,但是如果它们是单独编译的,那么我只是使用编译器标志来构建游戏的一种方式和编辑器的一种方式:

1
2
3
4
5
#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。