2012-08-01 24 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