2009-03-10 15 views
1

typed'de type kullanılırken başlık dosyalarına dahil edilmesi için kurallar

typedef double (MyClass::*MemFuncGetter)(); 

bir başlık dosyasında oluşturduğumda, "MyClass.h" yi eklemem gerekir mi yoksa bildirmek için ileriye mi gerek?

Başlık dosyası:

#ifndef _TEST_ 
#define _TEST_ 


#include "MyClass.h" //do I need this? 
//or I can just say class MyClass; 

typedef double (MyClass::*MemFuncGetter)(); 


#endif 

Burada bağlantı kuralları nelerdir?

cevap

2

Sen sınıfın sadece ileriye beyanı ile gayet:

#ifndef _TEST_ 
#define _TEST_ 

class MyClass; 
typedef double (MyClass::*MemFuncGetter)(); 

#endif 

Ama Sınıfım modül, çok olduğunda bütün sınıfı dahil etmeyerek, derleyici davalarına bakacak fazladan iş yapmak zorunda olduğuna dikkat sanal kalıtım karmaşası, bilmediği için. Bazı durumlarda bu her bir işlev işaretçisinin aslında 20 bayta kadar bellek gerektirdiği anlamına gelebilir. Eğer bütünü tanımlamış olsaydınız, her bir fonksiyon gösterici sadece 4 alırdı. (Elbette boyutlar da derleyiciye bağlıdır).

0

dosya MyClassFwd.h oluşturun ve orada

class MyClass; 
typedef double (MyClass::*MemFuncGetter)(); 

koymak Ve decl ileri şunlardır - bu yeterli olacaktır. Typedef kopyalayıp yapıştırmayın. 'MyClass.h' dosyanıza 'MyClassFwd.h'

+0

Bu, ileriyi ilan edip etmeyeceğinin sorusu muydu? –

0

'u dahil edin. En az MyClass bildirgesine sahip olmanız gerekir - en az bir ileri bildirim. Typedef bir takma ad oluşturun. Yeni bir tip oluşturmaz veya bağlantıyı değiştirmez. Bağlantı, MemFuncGetter'unki olacaktır.

0

Evet ileri sarma yeterli olacaktır.

İlgili konular