1

観察するクラスと観察されるクラスがあるとしましょう。オブザーバーに通知したいのですが、提示された方法で。

監視されるクラスには、監視するクラスのメソッドへのポインターの配列があります。したがって、基本的に、監視対象クラスでnotifyObserversを呼び出すと、この配列を通過し、オブザーバーで必要な関数を呼び出すだけです。その解決策は私の先生によって提示されました、そして私はそれを機能させるのに苦労しています、彼はこの解決策が(オブザーバーデザインパターンのように)メソッドへのポインターだけをオブザーバーへのポインターを保持する必要がないことを悲しいです。しかし、誰がそれらを呼び出すべきかを知っているメソッドへのポインタをどのように保存するのですか?

私はこのようなことを試みました:

class A { 
public:
    void method();
} 
A a;   
void(A::*ptr)()=&a.method;
void (*ptr)()=&a.method; 

これは明らかに機能しませんでした。それを機能させる方法さえありますか?

4

2 に答える 2

3

バインドを使用してみてください:

std::function<void()> ptr = std::bind(&A::method, a);
ptr(); // calls a.method();

betabandidoが述べたように、これはC ++ 11でそのまま、またはブーストを使用する古いバージョンでのみ機能することに注意してください。

于 2012-05-26T12:37:17.447 に答える
0

誰かがまだこれを見ている場合に備えて。まさにそれを行う良いブログ投稿があります。

http://juanchopanzacpp.wordpress.com/2013/02/24/simple-observer-pattern-implementation-c11/

C ++ 11を使用していない場合は、boost::bindとboost::functionを使用してこれを機能させることができます。

于 2013-05-24T01:57:44.207 に答える