【问题标题】:Is there a way in C++ to make scoped global variables?在 C++ 中有没有办法制作作用域的全局变量?
【发布时间】:2021-11-12 03:10:48
【问题描述】:

假设我有一个使用 n 个大模块的程序:

A) 网络/通讯

B) I/O 文件

C) I/O 数据库

D) 图形用户界面

E) ...

当然,模块列表可以更大。

假设我想要一些全局变量,但范围仅限于单个模块。

例如,假设 I/O 数据库模块将包含 10 个类,每个类代表数据库中的每个表,但它需要一些 global const 状态,例如 Name of table AColumns of table A 等(因为它是关系型数据库,在表DI中可能需要用到表A)。 也很明显,我不需要通过网络/通信模块访问这些表名。有没有办法让变量“全局”地只对类的某些部分可访问?

只是为了澄清-我知道“对某些部分来说是全局的”是一个矛盾,但我的想法是我想保持可访问性(不需要将指针传递给每个对象),同时限制它可以的位置被调用(例如,从全局范围限制到模块范围)

【问题讨论】:

  • 命名空间不够吗?除非你有一个硬限制,比如“A 不能访问 B,但 C 可以访问 B”。
  • 这不是static关键字的用途吗?
  • 你不需要全局变量,我强烈建议你学习依赖注入。基本上你有一个“工厂”模块。每个模块都有一个接口,您可以注入一个具有 getter 的接口来访问集中数据。 (例如,类的 n 个实例的成员)。这也允许您使用模拟和存根测试独立模块(例如,返回其他值的测试类)。
  • 依赖注入应该比命名空间更好。您可以控制每个模块的范围,但是如果您已经有一个庞大的项目并且主要使用全局单例..那将是非常痛苦的。
  • C++20 模块可能会有所帮助。

标签: c++ scope global


【解决方案1】:

你不需要全局变量,我强烈建议你学习依赖注入。基本上你有一个“工厂”模块。每个模块都有一个接口,您可以注入一个具有 getter 的接口来访问集中数据。 (例如,类的 n 个实例的成员)。这也允许您使用模拟和存根测试独立模块(例如,返回其他值的测试类)。 ——

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 2017-09-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多