【发布时间】:2014-01-19 15:25:34
【问题描述】:
目前我为每个使用它的代码创建一个新的类实例。构造函数采用字符串名称,所以我知道在类内部,谁调用了我的方法。
class Log {
public:
Log(std::string Name) : name(Name) {}
void Print(std::string Message) {
std::cout << name << " said " << Message << std::endl;
}
private:
std::string name;
};
这个示例类被一系列模块使用,这些模块派生自抽象类型。
class Module {
public:
Module(std::string Name) : log(new Log(Name)) {}
virtual void Update() = 0;
private:
Log *log;
};
class Renderer : public Module {
public:
void Update() {
log->Print("Hello World!");
}
};
Renderer renderer("Renderer");
renderer.Update(); // "Renderer says Hello World!"
但现在,我想为所有模块共享同一个 Log 实例。我怎样才能做到这一点,并且仍然与方法调用的来源不同?
背景:有很多模块,它们使用两种类型的类。首先,在模块之间全局共享的管理器。其次,像上面的示例类这样的助手是为每个模块单独创建的。但我想找到两者的单一抽象来实现更简单的设计。考虑一个日志助手,它应该用不同的、均匀分布的颜色为不同模块的消息着色。这样的助手需要在所有模块之间共享状态。
【问题讨论】:
-
这不是一个好主意,但你可以试试这个:gnu.org/software/libc/manual/html_node/Backtraces.html
-
你不能。出于这个原因,我们使用访问修饰符。
-
模块不能告诉记录器它们是哪个模块吗?或者如果只是颜色发生变化,使用哪种颜色?
-
@TomaszKłak 我不是指某种反射或回溯,而是在 C++ 中解决我的问题的设计。
-
@JosephMansfield 他们可以。像
log->Print(name, "Hello World!");这样的东西。但我正在寻找一种方法将该逻辑放入基础Module类或Log类中。