循环依赖,即使类是向前声明的

时间:2015-12-10 15:33:52

标签: c++ visual-studio-2015 circular-dependency

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

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

提前感谢您的建议。

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

2 个答案:

答案 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;,由于包含警戒而为空。 那个是你必须要打破的循环,而且需要仔细思考什么需要什么,以便你可以拥有线性依赖而不是循环的类,这将使它成为可能使您的标题线性依赖而不是循环。