如果一个类的成员是静态常量,那么创建该类的成本很高,并且在创建后永远不会更改
Should a member of a class, that is expensive to create and will after creation never change, be static const?
我有一个类,它有一个类型为std::map
的成员。这个map
是通过调用这个类的方法makeMap()
创建的。它读取一个配置文件并填充map
。在我的场景中,我创建了这个类的一个实例,并构造了map
。然后递归地解决一些问题,涉及对象的许多副本。然而,map
保持不变(其他一些成员正在更改(。
这样的map
应该是static const
吗?由于它在创建后不会更改,并且可以在创建第一个实例时进行创建,因此在复制实例时复制map
是没有意义的。
这对static const
有用吗?
否。原因是可测试性和耦合性。
通过使其成为静态的,可以防止在测试时注入mock。你也让未来的改变变得更加困难。
尤其是因为创建成本很高,所以在测试时你不想这么做。你可能想要注入一个Mock或Fake。
这是真的,即使它是常量。也许有一天不会?
你可以在这里阅读关于全球状态的负面影响:
https://softwareengineering.stackexchange.com/questions/148108/why-is-global-state-so-evil
现在,为了实用,如果您希望只创建一次映射,但有许多对象实例,则可以在main()
中创建它,并使用依赖注入将其传递给构造函数。
您也可以使用生成器设计模式来解决这个问题(而生成器可以将映射作为静态对象(
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- Linux 从永远在线的应用程序中创建和删除文件
- 如果使用WM_PAINT样式创建 Window,则永远不会传递WS_POPUP消息
- 创建boost线程时,Shared_ptr永远不会释放
- 如果一个类的成员是静态常量,那么创建该类的成本很高,并且在创建后永远不会更改
- 创建一个 for(永远)循环。系统不想启动
- 如何声明一个函数,该函数创建一个永远不会为 null 的对象