C ++中的全局变量

时间:2010-08-25 16:02:34

标签: c++ singleton global-variables extern

在具有许多类的C ++多线程应用程序中,我试图找出定义全局变量的方法

  1. C样式,在任何一个源文件中将其定义为全局,在头部中将其定义为extern,该头部包含在访问此变量的类中。

  2. 编写一个Singleton类,它包含这些全局变量并公开set / get方法来写入变量。

  3. 通过第二种方法,可以通过集中方式而不是第一种方法来控制多线程访问。

    有更多更好的方法吗?

9 个答案:

答案 0 :(得分:4)

首先尽量避免全局变量。如果您只是需要这样做(例如cincoutcerr就是这种情况),您的第二种方法肯定是最好的(更自然)方式。

答案 1 :(得分:3)

我肯定会选择Singleton课程。这是在多线程OOP环境中处理“全局”变量的最佳方法。

答案 2 :(得分:3)

如果可以缩小“全局变量”的范围(通常是这种情况 - 有多少变量真正全局?)那么您可以在适当的拥有类中使其成为私有静态类成员。如果您的其他类需要查看它(或更不可能更新它),请提供get / put访问器。

答案 3 :(得分:1)

如果您必须使用全局变量(为什么使用全局变量?)我建议您采用第二种方式。第一种方法是遇到各种命名空间问题。

答案 4 :(得分:1)

这个问题很容易用替代方法解决。

C ++的新运算符 :: 称为范围解析运算符,可以非常轻松地解决这个问题。语法如下

:: variable-name;

此运算符允许访问vriable的全局版本。

答案 5 :(得分:1)

人们倾向于选择第二种方法,因为它似乎可以为您提供更好的控制,但在某些情况下它可能不会非常有用。

首先,在我对OOP哲学的理解中,我不认为对象是一堆数据的集合,而是根据哪些实体来表示现实世界的问题。因此,我不认为有一个类存储随机数据是个好主意。特别是当数据成员很大程度上不相关时。

其次,如果您正在考虑拥有一个中央控制,例如。只有一个互斥锁来访问所有数据成员,对于不相关的数据成员来说这不会很好。您将不必要地阻塞大量线程,而他们想要的数据并不完全是当前受锁保护的数据。

所以看起来很奇怪,但我更喜欢第一种方法。

答案 6 :(得分:0)

这取决于手头的问题。

C风格的全局变量具有简单的优点,不需要Singleton :: instance()调用。但是,Singleton :: instance()允许您在第一次调用时初始化全局状态。

为了充分利用两个世界,使用使用Schwarz Counter方法初始化的C风格全局变量。 http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter

答案 7 :(得分:0)

您可以使用句柄/正文惯用法定义一个包含单个实现的值对象。

另请参阅Alexandrescu撰写的“现代C ++设计”,讨论在MT环境中实现单例的困难以及如何解决这些问题。

答案 8 :(得分:0)

不要踢死马,但如上所述,避免全局变量是最佳解决方案。列出了here的一些原因。如果必须使用全局变量,您可能需要考虑提供一个函数来访问它,以避免所谓的“全局初始化惨败”。

相关问题