2010-04-01 94 views
2

对我来说,我通常会让所有成员都成为静态的全球课程。所有其他类将继承此全局类。在C++中使用全局变量的最佳方式是什么?

我想知道这是否是一种好的做法?

有人有什么建议吗?

+5

为什么要使用全局变量? – 2010-04-01 19:54:38

+0

如果所有成员都是静态的,并且该类可以在全局访问,那么为什么您需要从它继承?如果该字段是公共的,您可以使用Namspace :: ClassName :: MemberName访问这些字段。 – 2010-04-01 20:04:33

+3

@Steve:关于这个问题的可怕之处在于,我可以把它写成愚人节玩笑话,尽管我会努力工作至少一个额外的坏主意。 – 2010-04-01 20:11:08

回答

6

通常尽量避免全局变量,因为它们引入全局状态。与全球国家,你没有referential transparency。引用透明度是一件好事,全球状况是一件坏事。例如,全局状态使得单元测试毫无意义。

虽然你必须,但我同意大多数时候你提到的方法是好的。您还可以在任何.cpp文件中声明全局变量,然后在.h文件中为该全局变量指定一个外部变量。

+0

难道你不想要一个全局状态,例如,在一个调试类或一组调试功能中,允许随着时间的推移输出到中央窗口或控制台。有些东西很难调试,比如具有关键部分的线程...... – Eric 2011-01-26 21:01:04

0

Ick!

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

1

最好的方法?仔细地...... :-)

1

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

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

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

1

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

全球国家的性质并不重要。例如,这通常是关于Singleton模式的恶意代码。

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

-1

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

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

+1

如果您只需要一个实例化,那么只能进行一个实例化。无需过度复杂的事情。 http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never-had-since-1995/ – GManNickG 2010-04-01 20:15:15

1

有两件事情是懊恼我:使用全局变量是不好的,但有时很难不这样做,但是我对懊恼:

  • 继承的明确滥用
  • 美妙的依赖问题

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

比方说,我创建将访问一个全局变量的一类,从你的反模式它提供了:

#include "globals.h" 

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

当然,#include是在头强制性的,因为我是从它继承。因此,每次我添加/更改一个全局变量,即使是单个类使用的变量,我也会重新编译整个应用程序。

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

相关问题