regras para inclusão em arquivos de cabeçalho ao usar tipo em typedef
-
08-07-2019 - |
Pergunta
se eu criar
typedef double (MyClass::*MemFuncGetter)();
em um arquivo de cabeçalho, que eu preciso para incluir "MyClass.h" ou faria em frente declarando suficientes?
Arquivo de Cabeçalho:
#ifndef _TEST_
#define _TEST_
#include "MyClass.h" //do I need this?
//or I can just say class MyClass;
typedef double (MyClass::*MemFuncGetter)();
#endif
Quais são as regras de ligação aqui?
Solução
Você está bem com apenas a declaração para a frente da classe:
#ifndef _TEST_
#define _TEST_
class MyClass;
typedef double (MyClass::*MemFuncGetter)();
#endif
Mas note que, não incluindo toda a classe, o compilador tem que fazer trabalho extra para lidar com os casos em que MyClass é uma bagunça de múltipla virtual herança, uma vez que não sei. Em alguns casos, isso pode significar que cada ponteiro de função realmente leva até 20 bytes de memória. Enquanto que se você tivesse definido o todo, cada um ponteiro de função só iria tomar 4. (É claro que os tamanhos são todos dependentes do compilador).
Outras dicas
Você precisa ter pelo menos uma declaração de MyClass
no escopo - uma declaração para a frente, pelo menos. Typedef criar um alias. Ele não cria um novo tipo ou alterar a ligação. A ligação será o de MemFuncGetter
.
Sim frente declraing será suficiente.
Criar MyClassFwd.h arquivo e colocar lá
class MyClass;
typedef double (MyClass::*MemFuncGetter)();
E incluem decl frente - isso será suficiente. Não copie e cole typedef. Em seu 'MyClass.h' simplesmente incluir 'MyClassFwd.h'