【发布时间】:2011-10-24 13:28:09
【问题描述】:
在开发游戏时,我设计了一个在正常操作中具有 const 成员变量的类,如下所示:
class Foo {
/* ... */
protected:
const boost::unordered_map<short, short> m_map;
};
但是,在随附的游戏编辑器中,我想重用 Foo 类,但提供一种方法来编辑此 const 成员,因为它用于渲染游戏(并且我想重用编辑器的渲染器)。因此,我计划对 Foo 类进行子类化,以便提供更改各种属性以及序列化数据以保存编辑器数据的方法。我想知道是否有一种优雅的方式可以做到这一点,同时保持成员为 const 或者是否有更好的设计?
目前我想到的选项是:
- 删除 const 关键字,简单地不提供用于更改变量的公共接口
- 将渲染器更改为使用接口并在 Foo 和 Foo 的编辑器版本中分别实现它
- 重新实现 Foo 的公共接口,以便为 Foo 的编辑器版本使用新的可变映射
- 完全不同的东西?
首先,从语言的角度来看,接口路径似乎是最干净的,但会为所涉及的每个类都提供一个接口(抽象基类),这是一项体面的工作。欢迎提出建议和想法。 (注意:我很难想出一个描述性的标题;也欢迎提出建议。)
【问题讨论】:
-
"去掉 const 关键字,简单地不提供用于更改变量的公共接口" 您认为这种方法有什么缺点?如果您的类在设计时考虑了 const 正确性,那么您的
const成员函数无论如何都无法更改m_map。 -
虽然是真的,但考虑到通常地图永远不会改变,这似乎仍然有点臭,这意味着我失去了编译时检查。我不认为这会是一个问题,因为 Foo 的非编辑器使用应该只使用 const 引用,但它仍然让我感到厌烦。它可能仍然是最好的解决方案,但我很想看看是否有更好的选择。
-
这是惯用的解决方案,否则您的课程将失去可分配性。无论如何,使您的成员函数正确 const 为您完成了 50% 的工作。
标签: c++