模板 类 循环依赖问题 (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);
            }
        }

    };