C++模板化的主题观察者继承/角色冲突
C++ Templated Subject Observer Inheritance/Cast Conflict
我使用的是这个例子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;
观察员.h
#include "types.h"
template <class T>
class Observer
{
public:
Observer(){}
virtual ~Observer() {}
virtual void update(T subject) = 0;
};
主题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()) );
}
};
根据您想要实现的目标,您可以尝试更改(警告,未经测试的代码!):
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;
pBar
指向Bar
实例,因此attach()
期望Observer<BarPtr>
,而您传递shared_ptr<Observer<BarPtr> >
。
(顺便说一句,如果你已经使用boost了,那么使用boost.Signals2不是更好吗?)
相关文章:
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 反射 + 函数指针与观察者模式
- 观察者模式不起作用
- 观察者带有共同指针
- 观察者模式:为什么主题应该是抽象的?
- 使用 RxCpp 构建观察者/可观察模式
- C 设计:多个TCP客户端,Boost ASIO和观察者
- 使用POCO的多深度目录观察者
- 观察者模式专业化
- C 样本观察者模板类误差
- 如何在不必绑定到特定类的情况下实现观察者模式
- C++,函数指针与观察者模式
- 列表<观察者*>*和列表<观察者*>C++的区别
- Intotify观察者在LS或观看命令后停止工作
- 观察者常量正确性
- C++11观察者模式(信号、插槽、事件、更改广播器/侦听器,或任何您想称之为的东西)
- 修复 C++ 中的观察者设计模式
- C++模板化的主题观察者继承/角色冲突
- 观察者模式和继承:未调用正确的函数
- 观察者和继承C++