Por que o compilador não me permite encaminhar declarar um typedef?
Supondo que seja impossível, qual é a melhor prática para manter minha árvore de inclusão pequena?
c++
typedef
forward-declaration
user96825
fonte
fonte
typedef
nomes de um modelo de modelo multinível complexo usando uma declaração de encaminhamento dessa maneira são bastante complexos e difíceis. Sem mencionar que pode ser necessário mergulhar nos detalhes da implementação ocultos nos argumentos do modelo padrão. E a solução final é um código longo e ilegível (especialmente quando os tipos vêm de vários espaços para nome) muito propensos a alterações no tipo original.Para aqueles que gostam de mim, que desejam encaminhar declarar uma estrutura no estilo C que foi definida usando typedef, em algum código c ++, encontrei uma solução que é a seguinte ...
fonte
Para "declarar um typedef", você precisa declarar uma classe ou uma estrutura e, em seguida, pode digitar o tipo declarado. Vários typedefs idênticos são aceitáveis pelo compilador.
forma longa:
forma curta:
fonte
No C ++ (mas não no C), é perfeitamente legal digitar um tipo duas vezes, desde que ambas as definições sejam completamente idênticas:
fonte
A
campos dessa maneira, uma vez queA
é vazio por definição?Como para declarar um tipo, seu tamanho precisa ser conhecido. Você pode encaminhar declarar um ponteiro para o tipo ou digitar um ponteiro para o tipo.
Se você realmente deseja, pode usar o idioma pimpl para manter as inclusões baixas. Mas se você deseja usar um tipo, e não um ponteiro, o compilador precisa saber seu tamanho.
Edit: j_random_hacker adiciona uma qualificação importante a esta resposta, basicamente que o tamanho precisa ser conhecido para usar o tipo, mas uma declaração direta pode ser feita se precisarmos apenas saber que o tipo existe , a fim de criar ponteiros ou referências para o tipo tipo. Como o OP não mostrou código, mas reclamou que não seria compilado, presumi (provavelmente corretamente) que o OP estava tentando usar o tipo, não apenas se referindo a ele.
fonte
O uso de declarações avançadas em vez de um
#include
s completo é possível apenas quando você não pretende usar o próprio tipo (no escopo deste arquivo), mas um ponteiro ou referência a ele.Para usar o próprio tipo, o compilador deve conhecer seu tamanho - portanto, sua declaração completa deve ser vista -, portanto,
#include
é necessário um total .No entanto, o tamanho de um ponteiro ou referência é conhecido pelo compilador, independentemente do tamanho do apontador, portanto, uma declaração de encaminhamento é suficiente - ele declara um nome de identificador de tipo.
Curiosamente, ao usar ponteiro ou referência a
class
oustruct
tipos, o compilador pode lidar com tipos incompletos, economizando a necessidade de encaminhar também os tipos de ponta de ponte:fonte
Eu tinha o mesmo problema, não queria mexer com vários typedefs em arquivos diferentes, então resolvi com herança:
foi:
fez:
Funcionou como um encanto. Claro, eu tive que mudar as referências de
simplesmente
fonte
Substituí o
typedef
(using
para ser específico) por herança e herança de construtor (?).Original
Substituído
Dessa forma, eu pude encaminhar declarar
CallStack
com:fonte
Como Bill Kotsias observou, a única maneira razoável de manter os detalhes digitados do seu ponto em particular, e depois declará-los é com herança. Você pode fazê-lo um pouco melhor com o C ++ 11. Considere isto:
fonte
Como @BillKotsias, eu usei herança, e funcionou para mim.
Eu mudei essa bagunça (que exigia todos os cabeçalhos de impulso na minha declaração * .h)
nesta declaração (* .h)
e a implementação (* .cpp) foi
fonte