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.