reglas para la inclusión en los archivos de encabezado cuando se usa type in typedef
-
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í?
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'