2011-06-20 112 views
0

我試圖讓一個包含其他兩個對象類,這些對象應保持一個指針,它們都包含在類中。對於多類依賴性

例如......(我只使用上對象實例變量,在最後的想象有一類非常相似的ClassB的)

這只是我的main.cpp,想我會包括它是徹底...

//Filename: main.cpp 
#include "ClassA.hpp" 

int main(int argc, char **args) { 
    ClassA *a = new ClassA(); 
    // There would be some more here in the real code 
    return 0; 
} 

現在的在問題類...

//Filename: classA.hpp 
#ifndef CLASSA_H 
#define CLASSA_H 

#include "ClassB.hpp" 

class ClassA { 
public: 
    ClassA() { 
     b = new B(this); 
    }; 
    virtual ~ClassA(); 

private: 
    ClassB *b; 
}; 

#endif //CLASSA_H 

現在這裏是其它文件......

#ifndef CLASSB_H 
#define CLASSB_H 

#include "ClassB.hpp" 

//Filename: classB.hpp 
class ClassB { 
public: 
    ClassB(ClassA *parent) { 
     this->parent = parent; 
    }; 
    virtual ~ClassB(); 
private: 
    A *parent; 
}; 

#endif //CLASSB_H 

當我嘗試編譯此,我收到錯誤「錯誤:ClassA的沒有指定類型」,然後當然是「錯誤:''''''''之前'*'令牌「 我的猜測是這與他們包括彼此的東西?

(不知道它的問題,但在實際的代碼,功能的實​​現是在包括頭.cpp文件。這會做到這一點?)

+0

現在它解決了......我部分錯過了Java。 –

回答

1

ClassB的定義之前添加

class ClassA; 

; 簡單的例子:

class B; 

class A { 
     B * b; 
}; 

class B { 
     A * a; 
}; 

int main(int argc, char ** argv) { 
     return 0; 
} 
+0

是的,是的。謝謝。 我編寫了C++,而後又切換到了Java,最近又回到了C++。讓我意識到Java對於這些類中的某些東西來說有多好。 –

+0

C++中的類聲明/定義語法是瘋狂的。那麼,我認爲大多數C++都是瘋狂的。 –

3

我假設這些都是錯別字,但我可能會錯誤classA而您有A *

你需要做的是向前申報的類即ie。

class ClassA; 
class ClassB{ 
    ... 
}; 

與同爲ClassA

class ClassB; 
class ClassA{ 
     .... 
}; 
+0

啊,是的,很好。只需以實際的速度輸入此信息即可。 –

+0

爲什麼要聲明兩個類,而不是一個?只需formard聲明classB,並將classA的頭部包含在classB頭文件中。 無論哪種方式,當你實現內聯類方法時,除非找到其他類的完整定義,否則編譯器不會同意,如果其他類的方法/成員正在訪問。更好地實施(CPP)文件。 – Ajay

1

你可以做兩個方面,這一個;你可以讓ClassA和ClassB實現一個接口(或者因爲你是C++的超類),然後讓每個類都有一個定義爲接口的指針。第二種方法是在每個類之前使用前向聲明(即在定義ClassA之前定義ClassB和ClassB前向聲明之前的ClassA前向聲明)。

+0

我不認爲我們足夠了解建議在這裏使用繼承。 –

+0

我同意在某些情況下它可能不是完美的解決方案;但是,這不是我解決方案中的唯一選擇。我的其他解決方案與使用前向聲明的解決方案相同。 – Suroot