2012-02-24 146 views
1

我认为我有循环依赖问题,不知道如何解决它...... 尽可能短: 我编码的东西就像一个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 2010旗舰版和 它抛出我 “分析器”:不是类或命名空间名称

如何解决这个问题? 谢谢!

+7

解决方案:不要太懒惰;) – 2012-02-24 18:01:48

+0

@ 500-InternalServerError::-)所以这意味着我必须分开定义和声明?它会有帮助吗? – Novellizator 2012-02-24 18:04:24

+1

@Tomy:是的,没有分离它几乎是不可能的。 – 2012-02-24 18:07:00

回答

5

你可能想在这里做的是离开的方法声明在标题像这样

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(); // > 
} 

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

+0

重写了类,问题解决了。谢谢。无论如何,我有最后一个问题:在Parser.h我有一个声明,使用形式[矢量

parse();]如何解决?我试图在课前编写“#include”Form.h“”,但它没有帮助......最后我用“class Form”解决了它。在解析器类之前。有更好的解决方案吗?或者这是唯一的一个? – Novellizator 2012-02-24 18:40:39

+0

我的意思是:假设我在Parser.h中有另一个内联函数“void DO(){Form :: DODODO();}”这会引发编译错误 - 如何解决这个问题? – Novellizator 2012-02-24 18:44:51

+0

在源文件中定义'void DO()'类似于我在上面的回答中源文件中定义'parse()'的方法,而且这个问题也会消失。依赖类似的内联方法(即'Parser :: DO()'调用'Form'中定义的方法)反正是个坏主意...... – hatboyzero 2012-02-24 19:08:41

1
  1. 停止定义你的成员函数词汇在内联标题中。在源文件中定义它们。
  2. 现在,您可以在需要时利用转发声明(您不在此处)。