我在论坛上检查了几个关于这个主题的答案,但出于某种原因,我仍然无法解决这个问题并让我的作品运行起来。
我的目标是让一个类的一个对象在所有翻译单元中可用。请注意,我不打算在这里实现单例模式。该类可以有多个实例,但总会有至少一个一个,并且可以在包含“它的标题”的地方看到这个实例。
假设这样的设计:
---logging.h---
class LogCenter {
...
}
class Logger {
private:
LogCenter& center;
public:
Logger(); //automatically assigns the ominous global LogCenter object (reference) to center.
Logger(LogCenter&); //however, any other LogCenter object would work equally fine.
}
原因是什么?我希望所有 Logger
都可以默认使用这个全局 LogCenter
,无论它们在哪里使用。
但现在我不确定如何提供这个全局 LogCenter
。它有默认的构造函数。我是否只是将一行 extern LogCenter globalCenter;
添加到 logging.h
文件中,并将另一行 LogCenter globalCenter;
添加到 logging.h 文件中? cpp
文件?或者只是 LogCenter globalCenter;
在 logging.cpp
和 extern LogCenter globalCenter;
在任何使用它的文件中?
我真的很困惑,我试过的都没有用 - 但是,当我使用构造函数重载及其自己的 LogCenter
实例时,整体代码工作正常。
编辑:重要:extern
与声明一起使用(例如在头文件中)。然后是实现文件中的一个定义。
检查所有答案!
它是这样工作的:
---logging.h---
class Entry;
class LogCenter {
friend class Logger; //please don't bash my friend design right away... D:
private:
list<Entry> entries;
public:
void printLog(string file);
}
extern LogCenter SCenter;
class Logger {
private:
LogCenter& center;
public:
Logger(); //uses extern or "singleton" object.
Logger(LogCenter&);
void commitEntry(Entry); //adds the Entry object to the list in the center object.
}
-----------------
---logging.cpp---
#include "logging.h"
LogCenter SCenter;
void Logger::commitEntry(Entry e) {
entries.push_back(e); //Logger can access LogCenter fields!
}
void LogCenter::printLog(string file) {
//open file stream str
for(list<Entry>::iterator it = entries.begin();...)
str << it->getEntry() << endl;
//close file
}
--------------
---main.cpp---
#include "logging.h"
int main() {
Logger log;
Entry e("Some entry");
log.commitEntry(e);
SCenter.printLog("filename.log");
//or
LogCenter cent;
Logger log(cent);
Entry e("some entry");
log.commitEntry(e);
cent.printLog("filename.log");
return 0;
}
-------------
最佳答案
使用 extern
变量是一种选择。
另一种选择是使用一个返回引用的函数。
日志记录.h:
LogCenter& getGlobalLogCenter();
日志记录.cpp:
LogCenter& getGlobalLogCenter()
{
static LogCenter lc;
return lc;
}
关于c++ - C++中如何通过 "global"获取一个 `extern`类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33172176/