2011-02-11 18 views
27

Her biri diğer sınıf türünde bir nesne içeren iki sınıf oluşturmak istiyorum. Bunu nasıl yapabilirim? Bunu yapamazsam, her sınıfın diğer sınıf tipine işaretçisi içermesi gibi bir çalışma var mı? Teşekkürler! İşte C++ içinde birbirini veri olarak kullanan iki sınıf nasıl oluşturulur?

Ben ne:

Dosya: bar.h

#ifndef BAR_H 
#define BAR_H 
#include "foo.h" 
class bar { 
public: 
    foo getFoo(); 
protected: 
    foo f; 
}; 
#endif 

Dosya: foo.h

#ifndef FOO_H 
#define FOO_H 
#include "bar.h" 
class foo { 
public: 
    bar getBar(); 
protected: 
    bar b; 
}; 
#endif 

Dosya: main.cpp

#include "foo.h" 
#include "bar.h" 

int 
main (int argc, char **argv) 
{ 
    foo myFoo; 
    bar myBar; 
} 

$ g ++ main.cpp

In file included from foo.h:3, 
       from main.cpp:1: 
bar.h:6: error: ‘foo’ does not name a type 
bar.h:8: error: ‘foo’ does not name a type 

cevap

72
aksi takdirde nesne için belirsiz boşluğu gerekiyordu çünkü foo bar bulunmaktadır beri (doğrudan diğer türdeki nesneleri içeren iki sınıfları olamaz

o

Bir çubuğa sahip olan bir foo'ya sahip olabilirsiniz. Aslında bunu iki sınıf mağaza işaretçisine sahip olmakla yapabilirsiniz. Bunu yapmak için, ileri bildirimleri iki sınıfları birbirlerinin varlığını biliyor böylece kullanmanız gerekir:

#ifndef BAR_H 
#define BAR_H 

class foo; // Say foo exists without defining it. 

class bar { 
public: 
    foo* getFoo(); 
protected: 
    foo* f; 
}; 
#endif 

ve iki başlıklarını her içermediği

#ifndef FOO_H 
#define FOO_H 

class bar; // Say bar exists without defining it. 

class foo { 
public: 
    bar* getBar(); 
protected: 
    bar* f; 
}; 
#endif 

Bildirimi diğer. Bunun yerine, ileri bildirimlerle diğer sınıfın varlığını bilirler. Daha sonra, bu iki sınıf için .cpp dosyalarında, sınıf hakkında tam bilgi almak için #include diğer başlığa sahip olabilirsiniz. Bu ileriye dönük beyanlar, "foo need bar ihtiyaçlarının foo ihtiyaç çubuğunun" referans döngüsünü kırmanızı sağlar.

+8

"foo bar foo ihtiyaçları bar ihtiyacı ihtiyacı var." lawl. = P – prolink007

3

Bu mantıklı değil. A, B'yi ve B'yi A içeriyorsa, sonsuz boyutta olur. İki kutuya sahip olmanın ve ikisini de bir araya getirmeyi hayal edin. Çalışmıyor, değil mi?

İşaretçiler olsa çalışır:

#ifndef FOO_H 
#define FOO_H 

// Forward declaration so the compiler knows what bar is 
class bar; 

class foo { 
public: 
    bar *getBar(); 
protected: 
    bar *b; 
}; 
#endif 
+9

Futurama'da çalıştığını gördüm! –

İlgili konular