Variáveis privadas são uma maneira de ocultar detalhes de complexidade e implementação para o usuário de uma classe. Este é um recurso bastante interessante. Mas eu não entendo porque no c ++ precisamos colocá-los no cabeçalho de uma classe. Vejo duas desvantagens irritantes para isso:
- Desordena o cabeçalho do usuário
- Força a recompilação de todas as bibliotecas clientes sempre que os internos são modificados
Existe uma razão conceitual por trás desse requisito? É apenas para facilitar o trabalho do compilador?
struct foo{};
) não é permitido, mas declarações avançadas (struct foo;
) são.Respostas:
Isso ocorre porque o compilador C ++ deve saber o tamanho real da classe para alocar a quantidade certa de memória na instanciação. E o tamanho inclui todos os membros, também privados.
Uma maneira de evitar isso é usar o idioma Pimpl , explicado por Herb Sutter em sua série Guru da Semana # 24 e # 28 .
Atualizar
De fato, isso (ou mais geralmente, a (
#include
s) distinção ( ões) do cabeçalho / arquivo de origem é um grande obstáculo no C ++, herdado de C. Na época em que oC ++C foi criado, ainda não havia experiência com o desenvolvimento de software em larga escala. começa a causar problemas reais. As lições aprendidas desde então foram ouvidas pelos designers de linguagens mais recentes, mas o C ++ está vinculado a requisitos de compatibilidade com versões anteriores, tornando muito difícil abordar uma questão tão fundamental na linguagem.fonte
private
é mais moderna.A definição da classe precisa ser suficiente para o compilador produzir um layout idêntico na memória, sempre que você tiver usado um objeto da classe. Por exemplo, considerando algo como:
O compilador normalmente terá
a
no deslocamento 0 eb
no deslocamento4
. Se o compilador viu isso como justo:Ele "pensaria" que
b
deveria estar no deslocamento 0 em vez do deslocamento 4. Quando o código usando essa definição atribuída ab
, o código usando a primeira definição seriaa
modificado e vice-versa.A maneira usual de minimizar os efeitos de fazer alterações nas partes privadas da classe é geralmente chamada de idioma pimpl (sobre o qual tenho certeza que o Google pode fornecer uma grande quantidade de informações).
fonte
Provavelmente, existem várias razões. Embora os membros privados não possam ser acessados pela maioria das outras classes, eles ainda podem ser acessados pelas classes de amigos. Portanto, pelo menos nesse caso, eles podem ser necessários no cabeçalho, para que a classe amiga veja que eles existem.
A recompilação de arquivos dependentes pode depender da sua estrutura de inclusão. A inclusão dos arquivos .h em um arquivo .cpp em vez de outro cabeçalho pode, em alguns casos, impedir longas cadeias de recompilações.
fonte