regole per l'inclusione nei file di intestazione quando si utilizza digitare in typedef
-
08-07-2019 - |
Domanda
se creo
typedef double (MyClass::*MemFuncGetter)();
in un file di intestazione, devo includere " MyClass.h " o basterebbe dichiarare in avanti ?
File di intestazione:
#ifndef _TEST_
#define _TEST_
#include "MyClass.h" //do I need this?
//or I can just say class MyClass;
typedef double (MyClass::*MemFuncGetter)();
#endif
Quali sono le regole di collegamento qui?
Soluzione
Stai bene solo con la dichiarazione in avanti della classe:
#ifndef _TEST_
#define _TEST_
class MyClass;
typedef double (MyClass::*MemFuncGetter)();
#endif
Ma nota che non includendo l'intera classe, il compilatore deve fare un lavoro extra per gestire i casi quando MyClass è un pasticcio di ereditarietà multi-virtuale, poiché non lo sa. In alcuni casi ciò può significare che ciascun puntatore a funzione richiede fino a 20 byte di memoria. Considerando che se avessi definito il tutto, ogni puntatore a funzione prenderebbe solo 4. (Naturalmente le dimensioni sono tutte dipendenti dal compilatore).
Altri suggerimenti
Devi avere almeno una dichiarazione di MyClass
- almeno una dichiarazione a termine. Typedef crea un alias. Non crea un nuovo tipo né modifica il collegamento. Il collegamento sarà quello di MemFuncGetter
.
Sì, la riduzione in avanti sarà sufficiente.
Crea il file MyClassFwd.h e inseriscilo
class MyClass;
typedef double (MyClass::*MemFuncGetter)();
E includi il decl in avanti - sarà sufficiente. Non copiare e incollare typedef. Nel tuo "MyClass.h" includi semplicemente "MyClassFwd.h"