2012-01-25 60 views
1

我想知道爲什麼代碼下面不工作。 在b.cpp中,類B使用類A,但由於未找到類A的聲明而失敗。 但是,之前包含a.hpp。爲什麼#include「a.hpp」在這裏不起作用?標題包括和循環依賴

感謝您的幫助!

//=============================================== 
//file: a.hpp 
//=============================================== 
#ifndef _A_HPP 
#define _A_HPP 

#include "b.hpp" 

class A{ 
    public: 
     A(); 
     // others methods using B here 
}; 

#endif 


//=============================================== 
//file: a.cpp 
//=============================================== 
#include "a.hpp" 

A::A(){} 


//=============================================== 
//file: b.hpp 
//=============================================== 
#ifndef _B_HPP 
#define _B_HPP 

#include "a.hpp" 

class B{ 
    public: 
     B(A a); 
}; 

#endif 
//=============================================== 
//file: b.cpp 
//=============================================== 
#include "b.hpp" 

B::B(A a){} 



SHELL$ g++ -c a.cpp 
In file included from a.hpp:7, 
       from a.cpp:4: 
b.hpp:11: error: expected ‘)’ before ‘a’ 

回答

2

您需要使用Forward declarations打破這種循環依賴。
但是,請注意,一旦你向前聲明一個類型,該類型成爲不完全類型編譯器和有關於如何使用不完整的類型

0

從取出

#include "b.hpp" 

限制a.h和只有一個向前聲明 - 假設你在A使用指針B

//A.hpp 

class B; //forward declaration 

class A{ 
    public: 
     A(); 
     // others methods using B here 
}; 

另請參見:以下劃線_開頭的宏名稱由標準保留,不應使用。用B_HPP代替_B_HPP

+0

感謝的好評約_ – user744629

0

爲什麼你需要這樣的循環#include?如果你只需要編譯器知道一個類存在(因此它可以是一個參數等等),只是向前聲明它是這樣的:

class A; 

不要循環包含文件。即使有警衛,他們也只會被包括一次,當然,但是在編譯器達到其定義之前,或者在編譯器達到其定義之前提及B之前,您仍然會碰到A的提及。

+0

我在想一個#include是更好的,不重複的代碼,使維護支持方便。但好的,重複的代碼只是「A類」;並且它不應該在一個真正的長源代碼中長得多...... – user744629

0

當b.hpp包括a.hpp,_A_HPP已經被定義,所以預編譯器忽略文件的內容,所以在線路B(A a),編譯器不會,如果你真的瞭解A.

需要這些包括,請嘗試將#include "b.hpp"移至a.hpp的末尾(或者在b.hpp的頭部聲明class A;)。

+0

我在想一切都在一個大文件中,最後包含:a.cpp + a.hpp + b.hpp – user744629

+0

更像b.hpp + a .HPP + a.cpp – asaelr

0

在A.hpp中,不要包含調用B方法的B.hpp或inline A實現。

如果您需要參考B&B*,請在A.hpp(前向聲明)中使用class B;

取而代之,將那些A實現調用B.cpp中的B方法,並將A.hpp包含在A.cpp中。

1

這是行不通的。在你的頭文件中,你應該只包含引用或指向其他類的指針。然後,你可以轉發聲明A或B,例如:

//=============================================== 
//file: b.hpp 
//=============================================== 
#ifndef _B_HPP 
#define _B_HPP 

class A; 

class B{ 
    public: 
     B(A& a); 
}; 

#endif