模板类循环依赖关系问题(c++)



我想为事件系统实现一个观测器模式,但编译器给了我一堆错误,我目前无法修复它们。我在两个不同的头中有两个模板化的类,一个监听器和一个事件调度器,它们都需要存储指向另一个类的指针。

在Dispatcher.h 中

//Dispatcher.h
#pragma once
#include "Listener.h"
template <typename T>
class Dispatcher {
private:
std::vector<Listener<T>*> m_listeners;
public:
Dispatcher() {}
~Dispatcher() {
for (Listener<T>* l : m_listeners) {
delete l;
}
}
void Attach(Listener<T>* listener) {
m_listeners.push_back(listener);
}
void Detach(Listener<T>* listener) {
std::vector<Listener<T>*>::iterator it = std::find(m_listeners.begin(), m_listeners.end(), listener);
if (it != m_listeners.end()) {
m_listeners.erase(it);
}
}
void Notify(T& event) {
for (Listener<T>* l : m_listeners) {
l->OnEvent(event);
}
}
};

在Listener.h 中

//Listener.h
#pragma once
#include "Dispatcher.h"
template <typename T>
class Listener {
private:
Dispatcher<T>* m_dispatcher;
protected:
Listener(Dispatcher<T>* dispatcher) : m_dispatcher(dispatcher) {
m_dispatcher->Attach(this);
}
public:
virtual ~Listener() {
m_dispatcher->Detach(this);
}
virtual void OnEvent(T& event) = 0;
};

编译器似乎抱怨找不到侦听器的声明。这个怎么了?有人能解释一下吗?谢谢

附言:很明显,有一个cpp文件同时包含两个头。

您可以通过从Dispatcher.h中删除#include "Listener.h"并为类模板Listener<>添加正向声明来解决循环依赖性问题,如下所示:

Dispatcher.h

#pragma once
#include <vector>
//no need to include Listener.h

//forward declaration 
template<typename T> class Listener;
template <typename T>
class Dispatcher {
private:
std::vector<Listener<T>*> m_listeners;
public:
Dispatcher() {}
~Dispatcher() {
for (Listener<T>* l : m_listeners) {
delete l;
}
}
void Attach(Listener<T>* listener) {
m_listeners.push_back(listener);
}
void Detach(Listener<T>* listener) {
std::vector<Listener<T>*>::iterator it = std::find(m_listeners.begin(), m_listeners.end(), listener);
if (it != m_listeners.end()) {
m_listeners.erase(it);
}
}
void Notify(T& event) {
for (Listener<T>* l : m_listeners) {
l->OnEvent(event);
}
}
};

最新更新