Estou confuso sobre como separar código de implementação e declarações de uma classe simples em um novo cabeçalho e arquivo cpp. Por exemplo, como eu separaria o código da classe a seguir?
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y)
{
gx = x;
gy = y;
}
int getSum()
{
return gx + gy;
}
};
public:
membros no topo pode afetar muito , se o usuário os mover de acordo com este conselho - mas tiver dependências de pedidos entre os membros e ainda não estiver ciente de que os membros são inicializados na ordem de sua declaração ;-)Respostas:
A declaração de classe entra no arquivo de cabeçalho. É importante adicionar os
#ifndef
protetores de inclusão ou, se você estiver em uma plataforma MS, também poderá usar#pragma once
. Também omiti o privado, por padrão, os membros da classe C ++ são privados.e a implementação está no arquivo CPP:
fonte
#ifndef
coisas no cabeçalho?Em geral, seu .h contém a definição de classe, que é todos os seus dados e todas as suas declarações de método. Assim no seu caso:
E então o seu .cpp contém as implementações dos métodos como este:
fonte
É importante ressaltar aos leitores que se deparam com essa pergunta ao pesquisar o assunto de maneira mais ampla que o procedimento da resposta aceita não é necessário no caso de você apenas querer dividir seu projeto em arquivos. Só é necessário quando você precisa de várias implementações de classes únicas. Se sua implementação por classe for uma, basta apenas um arquivo de cabeçalho para cada uma.
Portanto, a partir do exemplo da resposta aceita, apenas esta parte é necessária:
As definições de pré-processador #ifndef etc. permitem que ele seja usado várias vezes.
PS. O tópico fica mais claro depois que você percebe que C / C ++ é 'idiota' e #include é apenas uma maneira de dizer "despejar este texto neste local".
fonte
.cpp
ou apenas é.h
realmente "bom" para esse método de organização de código?Basicamente, uma sintaxe modificada da declaração / definição da função:
a2dd.h
a2dd.cpp
fonte
A2DD.h
A2DD.cpp
A idéia é manter todas as assinaturas de funções e membros no arquivo de cabeçalho.
Isso permitirá que outros arquivos do projeto vejam como é a classe sem precisar conhecer a implementação.
Além disso, você pode incluir outros arquivos de cabeçalho na implementação, em vez do cabeçalho. Isso é importante porque quaisquer cabeçalhos incluídos no arquivo de cabeçalho serão incluídos (herdados) em qualquer outro arquivo que inclua o arquivo de cabeçalho.
fonte
Você deixa as declarações no arquivo de cabeçalho:
E coloque as definições no arquivo de implementação.
Você pode misturar os dois (deixe a
getSum()
definição no cabeçalho, por exemplo). Isso é útil, pois fornece ao compilador uma melhor chance de incluir, por exemplo. Mas isso também significa que alterar a implementação (se deixada no cabeçalho) pode desencadear uma reconstrução de todos os outros arquivos que incluem o cabeçalho.Observe que, para os modelos, você precisa manter tudo nos cabeçalhos.
fonte
Normalmente, você coloca apenas declarações e funções embutidas muito curtas no arquivo de cabeçalho:
Por exemplo:
fonte
Também não vou referir o seu exemplo, pois é bastante simples para uma resposta geral (por exemplo, não contém funções modeladas , o que força você a implementá-las no cabeçalho), o que sigo como regra geral é o pimpl idioma
Tem alguns benefícios à medida que você obtém tempos de compilação mais rápidos e o açúcar sintático:
class->member
ao invés declass.member
A única desvantagem é o ponteiro extra que você paga.
fonte