2009-03-10 9 views
1

wenn ichRegeln für die in Header-Dateien Aufnahme bei Verwendung von Typ in typedef

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

in einer Header-Datei zu erstellen, brauche ich "MyClass.h" einschließen oder würde vorwärts suffice erklären?

Headerdatei:

#ifndef _TEST_ 
#define _TEST_ 


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

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


#endif 

Was hier die Verknüpfungsregeln sind?

Antwort

2

Sie sind gut mit nur der Vorwärts Deklaration der Klasse:

#ifndef _TEST_ 
#define _TEST_ 

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

#endif 

Aber beachten Sie, dass durch nicht die ganze Klasse einschließlich der Compiler zusätzliche Arbeit zu tun hat, die Fälle zu behandeln, wenn MyClass ein Mehrfach- ist virtuelle Vererbung Chaos, da es nicht weiß. In einigen Fällen kann dies bedeuten, dass jeder Funktionszeiger tatsächlich bis zu 20 Byte Speicher belegt. Während, wenn Sie das Ganze definiert hätten, würde jeder Funktionszeiger nur 4 nehmen. (Natürlich sind die Größen alle Compiler-abhängig).

0

Datei MyClassFwd.h erstellen und setzen dort

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

und sind nach vorne Decl - das wird genug sein. Kopiere nicht und füge typedef ein. Geben Sie in Ihrer 'MyClass.h' einfach 'MyClassFwd.h' ein

+0

das war meine Frage, ob Vorwärtsdeklaration würde ausreichen? –

0

Sie müssen mindestens eine Deklaration von MyClass im Bereich haben - mindestens eine Forward-Deklaration. Typedef erstellt einen Alias. Es wird kein neuer Typ erstellt oder die Verknüpfung geändert. Die Verknüpfung wird die von MemFuncGetter sein.

0

Ja vorwärts deklrainieren wird genug.