我有一个简单的设置
class Container {
Handler h;
}
所有Container对象都有一个“warning()”方法。我想要 还有一种方法可以从Handler对象中输出警告,但是发送 这些警告使用包含对象的功能。
我确实意识到在所包含的对象中持有对容器的引用是奇怪的(通常是 包含的对象不应该知道任何关于它的容器)。现在,用一种语言 有闭包我会这样做(想象的语法):
h.set_warning_handler { | char* message |
this->warning(message)
}
但是我使用的是C ++,它不是像块一样使用Apple方言的地方。 解决这个问题的首选方法是什么?或者只是设置该引用并忘记它?
答案 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 { … };