c++ - C++中如何通过 "global"获取一个 `extern`类对象

标签 c++ global-variables extern

我在论坛上检查了几个关于这个主题的答案,但出于某种原因,我仍然无法解决这个问题并让我的作品运行起来。

我的目标是让一个类的一个对象在所有翻译单元中可用。请注意,我不打算在这里实现单例模式。该类可以有多个实例,但总会有至少一个一个,并且可以在包含“它的标题”的地方看到这个实例。

假设这样的设计:

---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.cppextern 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/

相关文章:

c++ - 如何使用 ctypes 将数组从 C++ 函数返回到 Python

C++ Makefile编译顺序

C:通过外部链接初始化全局常量

c - 全局值无法在另一个文件中访问?

c - 为什么要使用 `extern void my_func();` 而不是包括 `my_utils.h` ?

c++ - 用于构造 C++ 程序以确定范围的作业 Build 中的错误

c++ - Opencv DMatch距离超出范围

c++ - 如何比较 std::map 中的所有项目?

php - session 文件 - 它是什么时候创建的?

mysql - 为MySQL存储过程中的所有表设置默认排序规则