regole per l'inclusione nei file di intestazione quando si utilizza digitare in typedef

StackOverflow https://stackoverflow.com/questions/631808

  •  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?

È stato utile?

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"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top