Jul*_*lik 1 c++ oop composition
我有一个简单的设置
class Container {
Handler h;
}
Run Code Online (Sandbox Code Playgroud)
所有Container对象都有一个"warning()"方法.我想有一种方法从Handler对象中输出警告,但是使用包含对象的工具发送这些警告.
我确实意识到在包含的对象中持有对容器的引用是奇怪的(通常包含的对象不应该知道它的容器的任何内容).现在,在一个带闭包的语言中我会这样做(假想的语法):
h.set_warning_handler { | char* message |
this->warning(message)
}
Run Code Online (Sandbox Code Playgroud)
但我在C++工作,它不是一个像块一样使用Apple方言的地方.解决这个问题的首选方法是什么?或者只是设置参考并忘记它?
C++ 11有闭包:
h.set_warning_handler([&](char const* message) { this->warning(message); });
Run Code Online (Sandbox Code Playgroud)
[&]指定通过引用捕获上下文(需要捕获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 { … };
Run Code Online (Sandbox Code Playgroud)