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

时间:2011-08-10 23:46:43

标签: c++

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:5)

如果您的变量非 - constprotected感觉过于干扰,也许您可​​以设计变量为非constprivate的设计,并提供{ {1}}成员函数可以在您首先创建变量protected时使用您想到的任何约束来操作它。

答案 1 :(得分:1)

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

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

如果我没记错GCC你会想要-D __EDITOR__这样的东西,但是所有好的IDE都会在项目设置中有一个字段,您可以在其中指定编译器标志。它可以为您的代码库节省大量的重构或添加其他复杂功能。

答案 2 :(得分:0)

在我看来,你的问题是一个相当牵强的问题。两个类中没有理由具有相同的功能。不要重复自己。我建议创建一个具有可变属性的单个类,添加getter和setter,不要在没有必要的情况下使用setter。