我有一个ErrorLog
类,用于编写和修改日志文件。我想在重大事件之前和之后写入它以进行调试,我只想在整个应用程序中使用ErrorLog
类的一个实例。我尝试将ErrorLog
对象声明为全局,方法是将
ErrorLog exe_log;
放入头文件中,以便它可以访问其他文件,但我一直收到一条错误,说它已经定义了。是否有正确的方法来限制全局对象?
答案 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类型的静态成员。这样,全局对象将不在全局范围内(在某些情况下可能是危险的)。