2010-08-31 52 views
12

我剛剛開始使用C++進行編程,並試圖創建2個類,其中一個包含另一個類。類名不會在C++中命名爲類型

文件A.h

#ifndef _A_h 
#define _A_h 

class A{ 
    public: 
     A(int id); 
    private: 
     int _id; 
     B _b; // HERE I GET A COMPILATION ERROR: B does not name a type 
}; 

#endif 

文件A.cpp

#include "A.h" 
#include "B.h" 
#include <cstdio> 

A::A(int id): _id(id), _b(){ 
    printf("hello\n the id is: %d\n", _id); 
} 

文件B.h

#ifndef _B_h 
#define _B_h 

class B{ 
    public: 
     B(); 
}; 
#endif 

文件B.cpp

#include "B.h" 
#include <cstdio> 

B::B(){ 
    printf("this is hello from B\n"); 
} 

我首先編譯B級,然後,A級,但後來我得到的錯誤信息:

A.h:9: error: ‘B’ does not name a type

我該如何解決這個問題?

+0

@Georg你爲什麼把所有東西都放在一個代碼段中?他們是不同的文件。 – 2010-08-31 11:04:31

+0

@Amir:在我點擊*編輯*之前,它看起來很破碎,而且我心不在焉:) – 2010-08-31 11:08:27

+0

您可以通過點擊答案旁邊的勾號來接受您認爲最有用的答案之一。這對其他有類似問題的人會有幫助。 – Naveen 2010-08-31 11:10:28

回答

25

預處理程序將文件A.hB.h的內容正好插入include語句的位置(這實際上只是複製/粘貼)。當編譯器解析A.cpp時,它在知道類B之前發現類A的聲明。這會導致您看到的錯誤。有兩種方法可以解決這個問題:

  1. 包括B.hA.h。將頭文件包含在需要的文件中通常是一個好主意。如果您依賴間接包含,但通過另一個頭文件或編譯單元(cpp-file)中包含的特定順序,這隻會在項目變大時將您和其他人混淆。
  2. 如果在類A中使用類型B的成員變量,編譯器需要知道B的確切完整聲明,因爲它需要爲A創建內存佈局。另一方面,如果您正在使用B的指針或引用,那麼前向聲明就足夠了,因爲編譯器需要爲指針或引用保留的內存獨立於類定義。這看起來像這樣:

    class B; // forward declaration   
    class A { 
    public: 
        A(int id); 
    private: 
        int _id; 
        B & _b; 
    }; 
    

    這對於避免標題之間的循環依賴性非常有用。

我希望這有助於。

2

在「A.h」中包含「B.h」。在編譯'A'時爲編譯器帶來'B'的聲明。

第一個項目符合OP的情況。

$ 3.4.1/7 -

"A name used in the definition of a class X outside of a member function body or nested class definition27) shall be declared in one of the following ways:

before its use in class X or be a member of a base class of X (10.2), or

— if X is a nested class of class Y (9.7), before the definition of X in Y, or shall be a member of a base class of Y (this lookup applies in turn to Y’s enclosing classes, starting with the innermost enclosing class),28) or

— if X is a local class (9.8) or is a nested class of a local class, before the definition of class X in a block enclosing the definition of class X, or

— if X is a member of namespace N, or is a nested class of a class that is a member of N, or is a local class or a nested class within a local class of a function that is a member of N, before the definition of class X in namespace N or in one of N’s enclosing namespaces."

3

您必須首先包括A.hB.hB b;直到你包含B.h纔有意義。

2

問題是,您需要在A.h文件中包含B.h。問題是在A的定義中,編譯器仍然不知道B是什麼。你應該包括你使用的所有類型的所有定義。

1

當你定義了A級,在啊,你明確地說,班裏有一名成員B.

必須包括「波黑」中的「啊」

1

你不是缺少#包括「Bh」在啊?

2
error 'Class' does not name a type 

萬一有人做我也做了同樣愚蠢的事情...... 我是從頭開始創建一個小的測試程序和我打類,而不是(用小C)。我沒有注意到錯誤信息中的引號,並花了太多時間不瞭解我的問題。

我的解決方案搜索將我帶到了這裏,所以我猜其他人也可能發生同樣的情況。