在开发游戏的过程中,我设计了一个在正常操作中具有const成员变量的类:
class Foo {
/* ... */
protected:
const boost::unordered_map<short, short> m_map;
};
但是,在随附的游戏编辑器中,我想重用Foo类,但提供了一种编辑此const成员的方法,因为它用于渲染游戏(我想重新使用渲染器进行编辑)。因此,我计划对Foo类进行子类化,以便提供更改各种属性的方法以及序列化数据以保存编辑器数据。我想知道是否有一种优雅的方式来做这个,同时保持成员为const或有更好的设计?
到目前为止我提出的选项是:
从语言的角度来看,接口路径看起来最干净,但是为每个涉及的类提供了一个接口(抽象基类),这是一个不错的努力。建议和想法欢迎。 (注意:我很难想出一个描述性标题;也欢迎提出建议。)
答案 0 :(得分:5)
如果您的变量非 - const
和protected
感觉过于干扰,也许您可以设计变量为非const
和private
的设计,并提供{ {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。