这有一个非常奇怪的问题,即使向前声明受影响的类也无法解决循环依赖。
如您所见,这两个类都是前向声明的。所以有任何解释吗?没有定义任何类的符号。它显然是循环依赖性错误。
提前感谢您的建议。
LogBackend.h
<a href="LINK1" class="LINK1">
<p> TITLE THAT I WANT OVER THE FIRST IMAGE </p>
<img border="0" src="PHOTOLINK1" width="310" height="214">
</a>
<a href="LINK2">
<img border="0" src="PHOTOLINK2" width="310" height="214">
<a href="LINK3">
<img border="0" src="PHOTOLINK3" width="310" height="214">
<a href="LINK4">
<img border="0" src="PHOTOLINK4" width="310" height="214">
</a>
注意:有一些LogBackend的派生类
Logger.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
答案 0 :(得分:4)
由于您使用的是,在Logger.h中,std::vector<LogBackend>
前瞻声明是不够的,除非您将其更改为std::vector<LogBackend *>
或std::vector<std::shared_ptr<LogBackend>>
LogBackend有一个类似的问题,你使用的是Logger :: Level,因为你只是转发声明的Logger,所以它不可用。
我建议你只使用一个指向LogBackend的指针来破坏Logger.h中的依赖
答案 1 :(得分:1)
您通过添加这些前向引用来欺骗自己。根本问题是LogBackend.h有#include "Logger.h"
而Logger.h有#include "LogBackend.h"
。包含防护可以防止无限递归,但这也意味着当编译器在源文件中看到#include "Logger.h"
时,它会尝试编译&#34; Logger.h&#34;,其中包括&#34; LogBackend.h&# 34;,其中包括&#34; Logger.h&#34;,由于包含警戒而为空。 那个是你必须要打破的循环,而且需要仔细思考什么需要什么,以便你可以拥有线性依赖而不是循环的类,这将使它成为可能使您的标题线性依赖而不是循环。