2011-07-13 7 views
8

私はベアボーンのオブザーバパターンを実装していて、やや秘密のエラーに固執しています: "メンバ参照の基本タイプ 'Observer *'は構造体または共用体ではありません。私はこれが私のテンプレートの使用と関係があると思っています。私はまだかなり不快です。ここで問題のあるコードは、(物事を単純化するために除去ほとんどの短所/デストラクタ)である:問題オブザーバパターンの実装:「メンバ参照の基本タイプ________は構造体または共用体ではありません」

件名インタフェース:

class Subject { 
public: 
    virtual void notify(); 
private: 
    list< Observer * > m_observers; 
}; 

件名実装:

void Subject::notify() { 
    list< Observer * >::iterator i; 

    for (i = m_observers.begin(); i != m_observers.end(); i++) { 
     *i->update(this);      // ERROR !!! ERROR 
} 

オブザーバー抽象インタフェース:

class Observer { 
public: 
    virtual ~Observer(); 
    virtual void update(Subject * changedSubject) = 0; 

protected: 
    Observer(); 
}; 

コンクリートオブザーバインターフェイス:

class ConcreteObserver: public Observer { 

public: 
    ConcreteObserver(ConcreteSubject *); 
    virtual ~ConcreteObserver(); 

    virtual void update(Subject * changedSubject); 

private: 
    ConcreteSubject * m_subject; 
}; 

コンクリートオブザーバーの実装:

void ConcreteObserver::update(Subject * changedSubject) { 
    if (changedSubject == m_subject) { 
     report(); 
    } 
} 

誰もがこの問題の特定に役立つことができれば、私はそれを大幅に感謝。

乾杯、

+0

あなたは '(* i) - >更新(これ)を試しましたか? ' – Vlad

答えて

12

ニックの問題は、演算子の優先順位です。代わりに:

*i->update(this); 

使用:

(*i)->update(this); 

そうでなければ、それは*(i->update(this))として解釈され、エラーメッセージが得られ、ポインタのメソッドを呼び出そう。

+0

ああ。ありがとうインタージャイ、素晴らしい作品。私はこれを今、覚えている。今回はスティックを強くしてください。 – user810962

+0

ありがとう、これはObjective-Cで私を助けました! – hellozimi

+0

私も参考にオブジェクトを渡していました。そのプロパティを設定しようとすると、上記のエラーが発生しました。だから* referencedObject.name = @ "Bruce"にエラーがありました。(* referencedObject).name = @ "Bruce"は問題ありません。実際には、いいえ、私が得たエラーは "セマンティック問題:メンバー参照の基本型 'GoodClass * __ autoreleasing *'は構造体または共用体ではありませんでした。それにもかかわらず、解決策は機能します。 –

関連する問題