【发布时间】:2021-04-26 03:37:10
【问题描述】:
假设我有一个这样的程序:
文件 main.cpp
#include "something.hpp"
int main(int argc, char* argv[]) {
some = new Something();
return 0;
}
这将链接到由以下文件组成的 .so 库:
文件 logger.hpp
#include <iostream>
class Logger {
public:
Logger();
void log(char);
void set_name(char);
private:
char m_name;
};
文件 logger.cpp
#include "logger.hpp"
Logger::Logger() {}
void Logger::log(char msg) {
std::cout << this->m_name << " : " << msg;
}
void Logger::set_name(char name) {
this->m_name = name;
}
文件 something.hpp
#include "logger.hpp"
class Something {
public:
Something();
};
文件 something.cpp
#include "something.hpp"
Something::Something() {
logger->log("hello !");
}
现在的代码将在something.cpp 中的logger->log() 中失败,因为从未定义过logger。我可以通过添加logger = new Logger() 来解决这个问题。但我只想创建一个新的Logger 实例,如果在使用该库的程序/库中没有创建任何实例。当已经创建了一个实例时,我可以通过添加extern Logger logger; 来使用它。但是,当 no 实例已创建时,这将不起作用。有什么建议(有可能吗?)?
注意:我已经在使用 Gtkmm4 / Glibmm2.6,也许有使用 Gtk 或 Glib 的解决方案...
【问题讨论】:
-
“但我只想创建一个新的 Logger 实例,如果还没有创建...” - 这听起来像单例设计模式,除非我没有正确理解你的问题?
-
@BobMorane 你确实理解正确
-
好的,既然你似乎可以控制记录器类,也许你应该make it a singleton。如果您这样做,请注意,尽管单例也具有允许全局访问的副作用。但是,对于记录器,这可能没问题。
-
感谢@BobMorane 一如既往地为我指明了正确的方向;)但是,不同的库/程序中是否可以使用单例?
-
什么意思?如果记录器是它的库,只需链接到它即可使用它。除非你有其他考虑?
标签: c++ object logging gtk gtkmm