1

我有一个简单的设置

class Container {
    Handler h;
}

所有的 Container 对象都有一个“warning()”方法。我还想有一种方法从 Handler 对象中输出警告,但使用包含对象的工具发送这些警告。

我确实意识到在包含的对象中保存对容器的引用是奇怪的(通常包含的对象不应该知道任何关于它的容器的信息)。现在,在带有闭包的语言中,我会这样做(想象的语法):

h.set_warning_handler { | char* message |
    this->warning(message)
}

但我在 C++ 中工作,它不是使用 Apple 方言之类的地方。解决这个问题的首选方法是什么?或者只是设置该参考并忘记它?

4

1 回答 1

5

C++11 有闭包

h.set_warning_handler([&](char const* message) { this->warning(message); });

[&]指定通过引用捕获上下文(需要捕获this)。(…)声明参数列表和{…}lambda 的主体。

或者,您可以使Handler依赖项依赖于其容器。这引入了相当强的耦合,因此最好避免,但有时它是有道理的(例如,如果你还不能使用 C++11 特性),并且可以通过使用接口来削弱强耦合(以下使用后期绑定;有时,模板可能更合适):

struct CanWarn {
    virtual void warning(char const*) const = 0;
    virtual ~CanWarn() { }
};

class Handler {
    CanWarn const* warning_dispatcher;

public:

    void set_warning_dispatcher(CanWarn const* dispatcher) {
        warning_dispatcher = dispatcher;
    }

    …
};

class Container : public CanWarn { … };
于 2012-08-01T21:13:55.673 回答