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?

Foi útil?

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'

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top