c++ - 一个类如何知道谁调用了它的方法?

标签 c++ methods global state

目前,我为每个使用它的代码创建了一个类的新实例。构造函数采用字符串名称,因此我知道类内部调用了我的方法的人。

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 实例。我怎样才能做到这一点并且仍然与方法调用的来源不同?

背景:有很多模块,它们使用两种类型的类。首先,在模块之间全局共享的管理器。其次,像上面的示例类这样的助手是为每个模块单独创建的。但我想为更简单的设计找到两者的单一抽象。想一想一个日志助手,它应该用不同的、均匀分布的颜色为不同模块的消息着色。这样的助手需要在所有模块之间共享状态。

最佳答案

您可以通过对 Log 类进行一些更改,让它调用全局日志函数来简化该过程。这减少或消除了对当前日志记录使用方式的大量更改。

class Log {
public:
    explicit Log(const std::string& name) : name(name) {}
    void Print(const std::string& message) const {
        GlobalLogPrint(name, message);
    }

private:
    const std::string name;
};

您可以继续动态分配 Log 对象的实例,也可以使用组合。

class Module {
public:
    explicit Module(const std::string& name) : log(name) {}
    virtual void Update() = 0;
protected:
    Log log;
};

class Renderer : public Module {
public:
    void Update() {
        log.Print("Hello World!");
    }
};

关于c++ - 一个类如何知道谁调用了它的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21218650/

相关文章:

c++ - 释放内存的时候一定要用IF语句吗?

C++ fstream 删除选定点的文件内容

python - AttributeError: 'module' 对象没有属性 'get_combos'

php - 将变量从一个 php 包含文件传递到另一个 : global vs. 不

c++ - QT以编程方式制作下拉菜单小部件

c++ - g++ 不会在 Snow Leopard 下编译 std=c++0x

c# - 如果可能的话,如何使方法的返回值可选?

ruby - 试图创建一个从同一类中选择随机方法的方法

java - 在整个应用程序中全局捕获键盘组合以显示 Java 中隐藏的 JDialog

python - Python 中 globals() 的原因?