reglas para la inclusión en los archivos de encabezado cuando se usa type in typedef

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

  •  08-07-2019
  •  | 
  •  

Pregunta

si creo

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

en un archivo de encabezado, ¿debo incluir " MyClass.h " ¿o bastaría la declaración directa ?

Archivo de encabezado:

#ifndef _TEST_
#define _TEST_


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

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


#endif

¿Cuáles son las reglas de vinculación aquí?

¿Fue útil?

Solución

Estás de acuerdo con la declaración directa de la clase:

#ifndef _TEST_
#define _TEST_

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

#endif

Pero tenga en cuenta que al no incluir toda la clase, el compilador tiene que hacer un trabajo adicional para manejar los casos en que MyClass es un desastre de herencia virtual múltiple, ya que no lo sabe. En algunos casos, esto puede significar que cada puntero de función realmente ocupa hasta 20 bytes de memoria. Mientras que si hubiera definido el todo, cada puntero de función solo tomaría 4. (Por supuesto, los tamaños dependen del compilador).

Otros consejos

Debe tener al menos una declaración de MyClass en su alcance, una declaración directa al menos. Typedef crea un alias. No crea un nuevo tipo ni cambia el enlace. El enlace será el de MemFuncGetter .

Sí, la disminución progresiva será suficiente.

Cree el archivo MyClassFwd.h y póngalo allí

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

E incluir el declive hacia adelante, eso será suficiente. No copie y pegue typedef. En su 'MyClass.h' simplemente incluya 'MyClassFwd.h'

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top