【问题标题】:Should a member of a class, that is expensive to create and will after creation never change, be static const?一个类的成员,创建成本高,创建后永远不会改变,应该是静态常量吗?
【发布时间】:2017-02-12 15:39:49
【问题描述】:

我有一个具有std::map 类型成员的类。这个map是通过调用这个类的一个方法makeMap()创建的。它读取一个配置文件并填充map。 在我的场景中,我创建了这个类的一个实例并构造了map。然后递归地解决一些问题,涉及对象的许多副本。但map 保持不变(其他一些成员发生了变化)。

这样的map 应该是static const 吗?由于它在创建后不会更改,并且可以在创建第一个实例时完成创建,因此在复制实例时复制 map 是没有意义的。

static const 好用吗?

【问题讨论】:

  • 所有类实例都一样吗?
  • 是的,它是创建一次然后复制的。这个没有其他用处。
  • const - 表示它不会改变; static - 意味着类的所有实例都有一个版本。听起来这正是你想要的。
  • @UKMonkey:如果是const,它在创建后无法更改,因此 OP 描述的makeMap() 将不起作用。如果地图在某个时候应该变为只读,则应首先根据标志检查对其的突变。
  • @AndyG: 或者它是用复制构造函数制作的——或者它是一个指针。

标签: c++ static constants


【解决方案1】:

没有。原因是可测试性和耦合性。

通过将其设为静态,您可以防止在测试时注入模拟。您还使未来的更改更难轻松实施。

特别是因为它的创建成本很高,所以您不想在测试时这样做。您可能想要注入 Mock 或 Fake。

即使是 const 也是如此。也许有一天不会了?

您可以在此处阅读有关全局状态的缺点:

https://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil


现在为了实用,如果您希望该映射只创建一次但有许多对象实例,您可以在main() 中创建它并使用依赖注入并将其传递给构造函数。

您也可以使用构建器设计模式来解决这个问题(而构建器可以将地图作为静态对象保存)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多