2010-01-27 16 views
8

BenC++ ile birlikte bağımlı sınıflarla baş etmenin en iyi yolu nedir?

class foo 
{ 
    bar m_bar; 
}; 

Şimdi varsayalım çubuğu

class bar 
{ 
    foo * m_pfoo; 
} 

iki sınıfları birbirine başvuru sahibi foo izlemek için ihtiyacı olan bir üye olarak sınıf çubuğunun bir nesneyle bir sınıf foo var demek ve ileri bir beyan olmadan, derleme yapmaz. foo beyanı o sorunu Şimdi

class bar; 

çözer önce Yani bu satırı ekleyerek, burada sorun - başlık dosyaları yazarken, her başlık diğer bağlıdır: bar.h içinde tanımlarını ihtiyacı vardır ve foo.h tersine. Bununla baş etmenin doğru yolu nedir?

cevap

23

Tüm üye erişimini üstbilgiden ve kaynak dosyalarınıza taşımanız gerekir.

Bu şekilde, başlığında sınıflar bildirmek iletmek ve foo bunları tanımlayabilirsiniz: Eğer çalışma izni verecek

// foo.h 
class bar; 

class foo { 
    bar * m_pbar; 
} 

// bar.h 
class foo; 
class bar { 
    foo * parent; 
} 

- Sadece içine üye bilgi gerektiren tanımları koyamazsınız senin başlık - .cpp dosyasına taşıyın. .cpp dosyaları hem foo.h hem de bar.h içerebilir:

// Foo.cpp 
#include "foo.h" 
#Include "bar.h" 

void foo::some_method() { 
    this->m_pbar->do_something(); // Legal, now, since both headers have been included 
} 
+0

Bu, ihtiyacım olan şey için en iyi seçenek gibi görünüyor. –

+1

şimdi, bu çözüm sizin kodlu sınıflarınız templated ise ve bu nedenle başlık ve cpp dosyalarına ayrılamıyorsa nasıl çalışır? –

0

Bildiğim kadarıyla, bunu gerçekleştirmenin tek gerçek yolu, her iki sınıfın düzgün bir şekilde tanımlanmış olduğu çeviri birimi (.cpp) olana kadar sınıf tanımlaması gerektirmediği için işaretçiler kullanmasıdır.

2

Tek bir yol, üye olmayan soyut arabirim sınıfları yapmaktır. Daha sonra bu arayüz sınıflarından foo ve çubuğu alt sınıfı.

örn:

class FooInterface 
{ 
    // methods here 
} 

class BarInterface 
{ 
    // methods here 
} 

class Foo : public FooInterface 
{ 
    BarInterface *pBar; 
} 

class Bar : public BarInterface 
{ 
    FooInterface *pFoo; 
} 

Bu bağımlılıkları döngüsünü kırar (kendilerini birbirlerine bağımlı arayüzler sürece ve bu durumda daha sonra ise muhtemelen aynı dosya belirtilmelidir)

1

yılında örneğiniz, foo, bar (gerçek bir bar nesnesi içerdiğinden), ancak bar, foo (yalnızca bir foo * içeriyor olduğundan) bağlı değildir. Artık bar, bir tip adı olan foo'a bağlı olarak değişmektedir, bu nedenle bar.h adının bir ileri bildirimine gereksinim duyar: class foo;. foo, bar belgesine bağlıdır, bu nedenle foo.h içinde #include "bar.h" belirtilmelidir

C++ 'da birbirine doğrudan bağımlı olan sınıflar bulunamaz; Sadece işe yaramıyor. Sınıfları, örneğinizde olduğu gibi sadece var olan diğerlerine bağlı olacak şekilde ayırmalısınız. Doğrudan bağımlılık yaratan tek şey bir sınıfı temel sınıf veya alan olarak kullanmaktır; Başka herhangi bir kullanım, genellikle bir sorun olmayan dolaylı bir bağımlılık yaratır.

İlgili konular