2012-02-24 145 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. 現在,您可以在需要時利用轉發聲明(您不在此處)。