繁体   English   中英

循环依赖,即使类已提前声明

[英]Circular dependency even though classes are forward declared

这确实是一个很奇怪的问题,即使向前声明受影响的类也无法解决循环依赖。

如您所见,这两个类都是前向声明的。 那有什么解释吗? 没有定义任何一个类别的符号。 显然,这是一个循环依赖性错误。

预先感谢您的建议。

LogBackend.h

#ifndef LOGGER_BACKEND_H
#define LOGGER_BACKEND_H

#include "Logger.h"
#include <string>

namespace se {
    class Logger;
    class LogBackend {
    public:

        LogBackend() { }
        explicit LogBackend(const std::string& name);
        virtual ~LogBackend() { }

        virtual void log(const Logger::Level l, const std::string& text) = 0;

        /*
         Method interface
        */

        bool valid();
        std::string getName();

    protected:
        bool m_valid = true;
        std::string m_name;
    };
}
#endif

注意:有LogBackend的派生类

记录器

#ifndef LOGGER_H
#define LOGGER_H

#include "LogBackend.h"
#include <string>
#include <sstream>
#include <vector>
#include <glew/glew.h>

namespace se {
    class LogBackend;
    class Logger {
    public:

        enum class Level { WARNING, INFO, EXCEPTION, SEVERE };
        static std::string to_string(Level l);

        static void add(const LogBackend& backend);

        /*
         Methods
        */

    private:
        static std::vector<LogBackend> m_backends;
    };
}
#endif

由于正在使用,因此在Logger.ha std::vector<LogBackend> ,向前声明是不够的,除非将其更改为std::vector<LogBackend *>std::vector<std::shared_ptr<LogBackend>>

LogBackend也有类似的问题,您正在使用Logger :: Level,该功能不可用,因为您仅转发声明的Logger。

我建议您通过仅使用指向LogBackend的指针来打破Logger.h中的依赖关系

您通过添加这些前向引用来欺骗自己。 潜在的问题是LogBackend.h具有#include "Logger.h"而Logger.h具有#include "LogBackend.h" 包含防护可防止无限递归,但是这也意味着,当编译器在源文件中看到#include "Logger.h" ,它将尝试编译包括“ LogBackend.h”和“ Logger”在内的“ Logger.h”。 h”,由于包含防护而为空。 是您必须打破的循环, 是仔细考虑需要什么的问题,这样您就可以拥有线性相关而不是循环相关的类,这将使标头可以线性相关而不是循环相关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM