0

サンプルhttp://www.codeproject.com/Articles/3267/Implementing-a-Subject-Observer-pattern-with-templを使用して、テンプレート化されたサブジェクト/オブザーバー パターンを実装しています。ただし、継承が機能していないように見える迷惑なコンパイル エラー、または奇妙なキャストが発生しています。どんな助けでも素晴らしいでしょう。投稿の下部に、問題の原因となっている行があります。

エラー

FooManager.h: In member function
    'ReturnEnum FooManager::AddBar(BarPtr)':

Foo.h:150: error: no matching function for call to
    'Bar::attach(FooManagerPtr)'

Subject.h:23: note: candidates are: 
    void Subject<T>::attach(Observer<T>) [with T = boost::shared_ptr<Bar>]

コード

types.h

class Bar;
typedef boost::shared_ptr<Bar> BarPtr;

class FooManager;
typedef boost::shared_ptr<FooManager> FooManagerPtr;

Observer.h

#include "types.h"
template <class T>
class Observer
{
    public:
        Observer(){}
        virtual ~Observer() {}
        virtual void update(T subject) = 0;
};

Subject.h

#include "types.h"
template <class T>
class Subject
{
    private:
        vector< Observer<T> > m_observers;

    public:
        Subject() {}
        virtual ~Subject() {}
        void attach(Observer<T> observer)
        {
            m_observers.push_back(observer);
        }

        void notify()
        {
            for(vector< Observer<T> >::iterator it = m_observers.begin(); it != m_observers.end(); ++it)
            {
                (*it)->update(static_cast<T>(this));
            }
        }
};

Bar.h

#include "types.h"
class Bar             : public Subject<BarPtr>
{
};

FooManager.h

#include "types.h"
class FooManager                : public Observer<BarPtr>
{
    public:
        ReturnEnum AddBar(BarPtr pBar)
        {
            pBar->attach( FooManagerPtr(this, boost_null_deleter()) );
        }
};
4

2 に答える 2

1

達成したいことに応じて、変更を試みることができます (警告、テストされていないコード!):

    void attach(Observer<T> observer)
    {
        m_observers.push_back(observer);
    }

    void attach(boost::shared_ptr<Observer<T>> observer)
    {
        m_observers.push_back(observer);
    }

vector< Observer<T> > m_observers;

vector< boost::shared_ptr<Observer<T> > > m_observers;
于 2012-07-16T15:59:03.767 に答える
1

pBarBarはインスタンスを指しているため、 を渡している間は がattach()期待されます。Observer<BarPtr>shared_ptr<Observer<BarPtr> >

(ちなみに、すでにブーストを使用している場合は、Boost.Signals2 を使用したほうがよいのではないでしょうか?)

于 2012-07-16T16:00:52.710 に答える