在c ++中使用全局变量的最佳方法是什么?

时间:2010-04-01 19:51:06

标签: c++

对我来说,我通常会创建一个全局类,所有成员都是静态的。所有其他类将继承自此全局类。

我想知道这是不是一个好习惯?

有人有任何建议吗?

7 个答案:

答案 0 :(得分:6)

通常会尝试避免全局变量,因为它们会引入全局状态。而对于全球状态,您没有referential transparency。参考透明度是一件好事,全球状态是一件坏事。例如,全球州使单位测试毫无意义。

如果必须这样做,我同意大多数时候你提到的方法都没问题。您还可以在任何.cpp文件中声明全局变量,然后在.h文件中为该全局变量提供extern。

答案 1 :(得分:1)

最好的方式?小心......: - )

答案 2 :(得分:1)

您建议的做法尚未解决与全局变量相关的单个问题。

  • 具有访问功能的私有成员数据允许单点控制读/写和验证,提高稳健性,可维护性和易于调试。
  • 使数据成员静态只会降低灵活性;您可能希望包含相同数据结构的多个独立全局对象。如果只应该有一个,请使用单例模式。
  • 将不相关的全局数据收集到一个类中会破坏关于耦合和内聚的最佳实践,并且几乎不是OO。

This article与C和嵌入式系统有关,但与您的问题并无关联。

答案 3 :(得分:1)

首先,全球状态不好。它使程序的理解变得非常复杂,因为任何部分的行为都可能取决于全局变量。这使得测试更加困难。它提供了一种方法,通过这种方法,两个远程函数可以创建一个不一致的状态,这可能会破坏另一个函数,而且调试起来非常困难。

全球国家的性质无关紧要。例如,这通常是关于Singleton模式的诽谤。

然而,让每个类继承一个全局变量类是个坏主意。在C ++中,应该谨慎使用继承,因为它在实现中将两个类绑定在一起。让所有类以任何形式从一个基类继承,并且C ++不能很好地处理多重继承通常是一件坏事。获得“致命的钻石”效果真的很容易,因为如果A继承自B并且它们都继承自Global,则Global将在A的继承层次结构中出现两次。

答案 4 :(得分:1)

有两件事令我感到懊恼:全局变量的使用很糟糕,但有时很难没有,但是我很懊恼:

  • 明显滥用继承
  • 精彩的依赖性问题

两者的结合具有惊人的效果。

假设我创建了一个可以访问全局变量的类,它来自它给出的反模式:

#include "globals.h"

class MyClass: Globals // for my own sake I assume it's not public inheritance
{
};

当然,标题中必须#include,因为我继承了它。因此,每次我添加/更改一个全局,甚至是单个类使用的一个...我重新编译整个应用程序。

如果我们曾经在同一个团队工作过,那么至少可以说,这会给你一个非常严厉,非常严厉的评论。

答案 5 :(得分:0)

伊克!

全局变量是全局变量。重命名它 - 即使名称使其看起来像一个成员变量,也不会改变它。使用oridinary全局变量的每个问题,你仍然会使用全局变量as-common-static-member方案(可能还有一些新的)。

答案 6 :(得分:-1)

您很可能正在寻找Singleton模式。这并不是说所有全局变量都需要使用该模式。但是,当我有一个全局时,通常是因为我只需要一个实例来完成整个程序。在这种情况下,单身人士可以很好地工作。

http://en.wikipedia.org/wiki/Singleton_pattern