模板 类 循环依赖问题 (c++)
Template classes circular dependency issue (c++)
我想为事件系统实现一个观察者模式,但编译器给了我一堆错误,我目前无法修复它们。我在两个不同的 headers 中有两个模板化的 class,一个监听器和一个事件调度器,两者都需要存储指向另一个 class.
的指针
In 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);
}
}
};
In 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;
};
编译器似乎抱怨无法找到侦听器的声明。这有什么问题吗?有人可以解释吗?谢谢。
P.S。显然有一个包含 headers.
的 cpp 文件
您可以解决这个循环依赖问题,方法是从Dispatcher.h中删除#include "Listener.h"
并添加class 模板 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);
}
}
};
我想为事件系统实现一个观察者模式,但编译器给了我一堆错误,我目前无法修复它们。我在两个不同的 headers 中有两个模板化的 class,一个监听器和一个事件调度器,两者都需要存储指向另一个 class.
的指针In 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);
}
}
};
In 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;
};
编译器似乎抱怨无法找到侦听器的声明。这有什么问题吗?有人可以解释吗?谢谢。
P.S。显然有一个包含 headers.
的 cpp 文件您可以解决这个循环依赖问题,方法是从Dispatcher.h中删除#include "Listener.h"
并添加class 模板 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);
}
}
};