Normalmente, no C ++, a velocidade de desenvolvimento de jogos é valorizada em relação ao encapsulamento, portanto, você vê uma tonelada de membros da classe acessíveis ao público que realmente não deveriam ser públicos.
Parece que, na maioria dos casos, acho que apenas algumas classes muito seletas realmente precisam conhecer o funcionamento interno de outras classes a ponto de modificar ou ler seus dados privados.
Criar getters / setters públicos para esses dados privados expõe coisas que realmente não devem ser modificadas à toa ou à toa.
Um compromisso aqui seria usar classes de amigos? ou há alguma desvantagem nas aulas de amigos que não estou vendo.
fonte
Outra opção é usar o idioma PIMPL , onde parte da implementação da estrutura é um ponteiro para outro tipo. A maioria dos usuários da classe inclui apenas o arquivo de cabeçalho normal, onde a implementação é um ponteiro opaco. As classes que precisam acessar os dados particulares podem incluir o cabeçalho que define o outro tipo e usar a interface que ele fornece.
Esse é um padrão comum para programadores C que desejam funcionalidade semelhante a um amigo. Na minha opinião, ele também se dedica mais a pensar na separação de preocupações (um princípio geralmente bom de design que leva a códigos ortogonais reutilizáveis), em vez de no encapsulamento (uma técnica específica de OO que é útil para implementar a separação de preocupações, mas também geralmente é mal usada). complicar demais as coisas).
Ele tem uma vantagem sobre o amigo por não acoplar o amigo ao amigo. Algumas pessoas podem alegar que isso é uma desvantagem, já que agora qualquer pessoa pode "fazer amizade" com sua classe. Eu acho que é um medo injustificado, já que você ainda está explicitando o relacionamento (incluindo o cabeçalho). Se você tem medo disso, tem medo da sua capacidade (ou do seu colega de trabalho) de tomar decisões arquitetônicas inteligentes. Mas se você não pode tomar essas decisões adequadamente mais tarde, por que está confiando em si mesmo
friend
agora?Tem uma desvantagem no custo de tempo de execução. Ao armazenar os dados em um ponteiro, você tem pior coerência de cache e mais contagens de alocação, além de precisar de um destruidor para limpá-los.
fonte