其他源文件C ++无法访问全局对象

时间:2010-08-28 17:42:55

标签: c++ scope global-variables

我有一个ErrorLog类,用于编写和修改日志文件。我想在重大事件之前和之后写入它以进行调试,我只想在整个应用程序中使用ErrorLog类的一个实例。我尝试将ErrorLog对象声明为全局,方法是将

ErrorLog exe_log;
放入头文件中,以便它可以访问其他文件,但我一直收到一条错误,说它已经定义了。是否有正确的方法来限制全局对象?

4 个答案:

答案 0 :(得分:8)

您需要在头文件中使用声明,并在源文件中使用定义

foo.h中:

extern ErrorLog exe_log;   // declaration (note the "extern")

Foo.cpp中:

ErrorLog exe_log;          // definition

bar.cpp:

#include "foo.h"

答案 1 :(得分:2)

您应该在单个源文件中将其定义为,并在标题中将其声明为:

extern ErrorLog exe_log;

话虽如此,使用全局变量或类实例是不受欢迎的。你应该养成尽可能避免这种情况的习惯。

已经提出了一种称为Singleton的设计模式来处理这种情况,尽管如今许多开发人员for good reasons都非常不鼓励使用它。

答案 2 :(得分:0)

我认为您正在寻找Singleton Pattern。您应该在ErrorLog*类中有一个ErrorLog类型的静态成员,并使用create function初始化它,类似于:

// .h file
class ErrorLog {
  public:
    static ErrorLog* create() {
      if (!this->log)
        this->log = new ErrorLog();
      return this->log;
    }
  private:
    static ErrorLog* log;
    ErrorLog() {}
}
// .cpp file
ErrorLog* ErrorLog::log = NULL;

答案 3 :(得分:0)

我不知道任何“正确”的方式(至少,标准没有定义一个afaik)。但是,使用全局对象的一种好方法是使用singleton pattern定义它们。 在您的情况下,这将转换为在ErrorLog类中声明具有ErrorLog类型的静态成员。这样,全局对象将不在全局范围内(在某些情况下可能是危险的)。