【问题标题】:Effectively changing constness of member variable in subclass有效改变子类中成员变量的常量
【发布时间】: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++


【解决方案1】:

如果让你的变量不是constprotected 感觉太侵入性,也许你可以设计一个变量不是constprivate,并提供protected 成员函数来操作它最初创建变量 const 时所考虑的任何限制。

【讨论】:

  • 这让我觉得这是一个可能可行的想法。我很想看看其他人对此有何看法。有接盘侠吗?无论如何 +1。
  • 对我来说听起来像是一个干净简单的解决方案!我也 +1。
【解决方案2】:

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

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

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

【讨论】:

  • 我目前的设计是三个项目——游戏、编辑器和渲染器/游戏库。渲染器/库目前被设计为与使用无关,因此它会引入一种双向依赖,这似乎也不太理想。
  • 这很公平,但如果默认情况是它应该受到保护,那么这将起作用。就我个人而言,我只是删除 const 并确保我不修改它,因为这些事情太容易破坏生产力!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    相关资源
    最近更新 更多