циклическая зависимость ... как решить? - PullRequest
1 голос
/ 24 февраля 2012

Я думаю, что у меня есть проблема циклической зависимости и я не знаю, как ее решить .... Чтобы быть как можно короче: Я кодирую что-то вроде анализатора HTML. У меня есть файл main.cpp и два заголовочных файла Parser.h и Form.h. Эти заголовочные файлы содержат все определения ... (Мне лень создавать соответствующие файлы .cpp ...

Form.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': это не имя класса или пространства имен

Как решить эту проблему? Спасибо!

Ответы [ 2 ]

5 голосов
/ 24 февраля 2012

Что вы, вероятно, хотите сделать здесь, это оставить объявление метода в заголовке примерно так:

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 голос
/ 24 февраля 2012
  1. Прекратите определять лексически встроенные функции-члены в заголовках.Определите их в исходных файлах.
  2. Теперь вы можете воспользоваться предварительными объявлениями, когда они вам нужны (у вас их нет).
...