循环依赖关系..如何解决

cyclic dependency ... how to solve?

本文关键字:解决 何解决 依赖 关系 循环      更新时间:2023-10-16

我认为我有一个循环依赖性问题,不知道如何解决它。。。。尽量简短:我正在编写类似于html解析器的代码。我有一个main.cpp文件和两个头文件Parser.h和Form.h。这些头文件包含整个定义。。。(我懒得制作相应的.cpp文件…

表单.h如下所示:

//... standard includes like iostream....
#ifndef Form_h_included
#define Form_h_included
#include "Parser.h"
class Form {
public:
    void parse (stringstream& ss) {
        // FIXME: the following like throws compilation error: 'Parser' : is not a class or namespace name
        properties = Parser::parseTagAttributes(ss);
        string tag = Parser::getNextTag(ss);
        while (tag != "/form") {
            continue;
        }
        ss.ignore(); // >
    }
// ....
};
#endif

和Parser.h看起来像这样:

// STL includes
#ifndef Parser_h_included
#define Parser_h_included
#include "Form.h"
using namespace std;
class Parser {
public:
    void setHTML(string html) {
         ss << html;
    }
    vector<Form> parse() {
        vector<Form> forms;
        string tag = Parser::getNextTag(this->ss);
        while(tag != "") {
            while (tag != "form") {
                tag = Parser::getNextTag(this->ss);
            }
            Form f(this->ss);
            forms.push_back(f);
        }
    }
// ...
};
#endif

不知道这是否重要,但我正在MS Visual Studio Ultimate 2010中进行构建它把我扔了出去"Parser":不是类或命名空间名称

如何解决这个问题?非常感谢。

您可能想在这里做的是将方法声明像一样留在头中

class Form {
public:
    void parse (stringstream& ss);
// ....
};

并在源文件(即Form.cpp文件)中定义方法,如

#include "Form.h"
#include "Parser.h"
void parse (stringstream& ss) {
    properties = Parser::parseTagAttributes(ss);
    string tag = Parser::getNextTag(ss);
    while (tag != "/form") {
        continue;
    }
    ss.ignore(); // >
}

这应该可以解决您所看到的循环依赖性问题。。。

  1. 停止在头中以词法内联的方式定义成员函数。在源文件中定义它们
  2. 现在,当您需要转发声明时,您可以利用它们(这里没有)