Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Como Confiar En Los Hijos De Mis Amigos

Iniciado por Pogacha, 03 de Diciembre de 2005, 04:35:05 PM

« anterior - próximo »

Pogacha

 http://www.parashift.com/c++-faq-lite/frie...s.html#faq-14.4

Tengo:

class a  { friend class b; protected:  void fa(); } ;

class b  { virtual void fb(a *i) { i->fa() } };

class c : public b  { virtual void fc(a *i) { i->fa() } }; // Error no se puede acceder a un protegido de a!

Solucion fea:
class a {
friend class  b, c, d, e, f ,g ,h ,i ...
...
};

Como hago para heredar privilegios tambien sin tener que hacer una lista?
Se puede?
Donde puedo leer sobre el tema?

Saludos y gracias.

tiutiu

 Creo que simplemente no se puede.

De todos modos te desaconsejo que uses friends. Si quieres acceder a una funcion privada o protegida, o bien haces un metodo publico para acceder a ella o es que esa funcion no deberia ser privada/protegida.

Claro que ahi ya entra la manera de programar de cada uno, pero normalmente se desaconseja el uso de friends (algun uso particular tendra, como la herencia multiple para mixins).
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

Pogacha

 La verdad es que en este caso se justifica ...  
La idea es simple:
Un objeto que tiene propiedades propias y a su vez es un contenedor de muchos hijos polimorficos que tienen acceso a sus propiedades ( ej : una ventana ).

Al parecer no se puede, lo mas cercano que encontre es:

a.h
class a { protected: void fa(); };
a.cpp

class a2 : public a {
friend class b, c, d, e, f ,g ,h ,i ...
// mismo constructor ...
};

class b { virtual void fb(a2 *i) { i->fa() } };


Con lo cual si defino los hijos dentro de un .cpp no tendria problemas de encapsulamiento, pero esto resulta poco agradable a la vista tambien.

Sigo investigando ...

Saludos.

_Grey

 Esto que comentas es algo complejo, pero antes que nada, que en C++ no se puedan hacer ciertas cosas tiene sus motivos, y no es que tenga que ser imposible, sino solo que se tiene que hacer de cierta forma.

c no puede leer a a, por que no es amiga, no hay mas, quiza te sea util saber que puedes leer a a, desde c, con funciones de b.

Lo puedes hacer de 2 formas, asi:

class c : public b { virtual void fc(a *i) { b::fb(i);} };

siempre que fb no sea privado.


y incluso desde fuera asi:

a instancia_de_a;
c instancia_de_c;
instancia_de_c.b::fb(&instancia_de_a);

Siempre que fb sea public.

Saludos.

tiutiu

 Repito, ¿porque no haces miembros de acceso publicos? Sigo sin ver claro que en este caso sea necesario usar friends.

Otra opcion que te queda, es que la clase base de la que derivas (la friend) proporcione miembros protegidos para que sus hijos puedan acceder a la otra clase. Esto si lo veo una mejor solucion, puesto que la clase base controla la manera en que sus hijas ver a su amigo.


EDIT: vaya, no habia leido el post de _grey, ha dicho lo mismo q yo :P
b>:: Pandora's Box project ::
Notas e ideas sobre desarrollo de engines para juegos

Pogacha

 Particularmente

Menu.h
class TMenu
{
 friend class TItem;
 TItem *Items;

 TSonido *Sonido;
public:
 void  Entrar();
}


Entonces quiero que los items tengan acceso a Sonido, pero que nada externo al menu tenga acceso, con lo cual debo hacer friend a los items, pero los item son polimorficos y tengo como 10 clases de items con lo cual tendria que hacer una larga lista en un .h y cada vez que modifique algo tambien tengo que modificar el .h ... este caso es liviano pero mi idea era extender esto al motor donde tengo mas de 40 tipos de entidades que se modifican todo el tiempo y no quiero tener que andar recompilando todo cada vez que agregue una entidad o estado en el .h del motor ...
Se entiende el problema?
Sino tengo que crear funciones de acceso a los miembros del contenedor pero estamos en la misma, para eso los pongo public  ...

La solucion de _grey sirve en el ejemplo ;) pero no en el resto de los casos donde no se que cosa nueva voy a agregar ...

Sigo investigando ...

Saludos y gracias






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.