设计建议:从包含的对象调用容器对象上的方法

时间:2012-08-01 21:11:46

标签: c++ oop composition

我有一个简单的设置

class Container {
    Handler h;
}

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

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

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

但是我使用的是C ++,它不是像块一样使用Apple方言的地方。 解决这个问题的首选方法是什么?或者只是设置该引用并忘记它?

1 个答案:

答案 0 :(得分:5)

C ++ 11有closures

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

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

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

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 { … };