[英]Will forward-declaration of two classes lead to circular dependency in the constructor?
[英]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.