2012-08-01 44 views
1

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

class Container { 
    Handler h; 
} 

简单的设置所有的容器对象都有一个“警告()”方法。我想 也可以从Handler对象中输出警告,但使用包含对象的设施发送 这些警告。

我意识到持有对容器中包含对象的引用是奇怪的(通常为 包含的对象应该不知道它的容器)。如今,在语言 带密封盖我会做它像这样(假想的语法):

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

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

回答

5

C++ 11具有closures

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

这将是一个选项,但我用它只用于GCC 4.0,所以这显然不工作。除非4.0以某种方式支持这些作为草案,我怀疑... – Julik 2012-08-01 21:19:10