有效地改变子类中成员变量的常量
Effectively changing constness of member variable in subclass
在开发一款游戏时,我设计了一个类,在正常操作中有一个const成员变量,如下所示:
class Foo {
/* ... */
protected:
const boost::unordered_map<short, short> m_map;
};
然而,在附带的游戏编辑器中,我想重用Foo类,但提供一种方法来编辑这个const成员,因为它用于渲染游戏(我想重用渲染器编辑器)。因此,我计划对Foo类进行子类化,以便提供用于更改各种属性的方法,以及序列化用于保存编辑器数据的数据。我想知道是否有一种优雅的方法来做到这一点,同时保持成员为const,或者是否有更好的设计?
目前我想到的选项有:
- 删除const关键字,并简单地不提供用于更改变量的公共接口
- 将渲染器更改为使用接口,并在Foo和Foo的编辑器版本中分别实现它
- 重新实现Foo的公共接口,为Foo的编辑器版本使用一个新的可变映射
- 完全是别的东西吗?
从语言的角度来看,接口路径似乎是最干净的,但是为每个涉及的类提供了一个接口(抽象基类),这是一个不错的努力。欢迎提出建议和意见。(注:我很难想出一个描述性的标题;
如果让你的变量非const
和protected
感觉太侵入,也许你可以设计一个变量非const
和private
的设计,并提供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。
相关文章:
- 用C++中的一个变量定义一个常量
- 通过多个头文件使用常量变量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 非常量变量只读位置的赋值
- 多个"常量引用"变量可以共享同一个内存吗?
- 使用大量已知常量变量的正确方法
- 常量成员函数中成员变量的类型
- 无法在具有常量变量大小的类中创建堆栈分配数组
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 这些语句是否等效(静态变量、常量变量和泛型)
- 如何将变量内容常量转换为 std::array 的大小?
- 我应该使我的局部变量常量还是可移动的
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 对全局变量的非常量引用的初始化无效
- 如何在 C++ 中的 wcstok 中使用常量 WCHAR* 变量?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 全局变量/常量的替代方案
- 为什么首选 if( 常量 == 变量 ) 而不是 if ( 变量 == 常量 )
- 在c++中声明一个变量常量有什么意义