Otra opción es usar el lenguaje PIMPL , donde parte de la implementación de la estructura es un puntero a otro tipo. La mayoría de los usuarios de la clase solo incluirán el archivo de encabezado normal, donde la implementación es un puntero opaco. Las clases que necesitan acceso a los datos privados pueden incluir el encabezado que define el otro tipo y utilizar la interfaz que proporciona.
Este es un patrón común para los programadores de C que desean una funcionalidad similar a la de un amigo. En mi opinión, también se acerca más a pensar en la separación de preocupaciones (un principio de diseño generalmente bueno que conduce a un código ortogonal reutilizable) en lugar de encapsular (una técnica específica de OO que es útil para implementar la separación de preocupaciones, pero que a menudo también se usa mal complicar demasiado las cosas).
Tiene una ventaja sobre el amigo que no une al amigo con el amigo en absoluto. Algunas personas pueden afirmar que es una desventaja, ya que ahora cualquiera puede "hacer amigos" en su clase. Creo que es un miedo injustificado, ya que aún haces explícita la relación (al incluir el encabezado). Si tiene miedo de eso, tiene miedo de su capacidad (o la de su compañero de trabajo) para tomar decisiones arquitectónicas inteligentes. Pero si no puedes tomar esas decisiones correctamente más tarde, ¿por qué estás confiando en ti mismo friend
ahora?
Tiene una desventaja de costo de tiempo de ejecución. Al almacenar los datos en un puntero, tiene una peor coherencia de caché y más recuentos de asignación, y también necesita un destructor para limpiarlo.