Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cosas Ocultas En Una Lib

Iniciado por Pogacha, 05 de Octubre de 2005, 01:01:30 PM

« anterior - próximo »

zupervaca

Cita de: "zupervaca"en mi practica con librerias de c++ siempre hay una funcion global o que pertenece a otra clase que nos devuelve la clase creada solucionando el problema que mencionas, un ejemplo de ello se ve en direct3d, siempre que quieres crear un objeto com le pasas un puntero y el te crea el objeto, de esta forma el usuario tendra solo acceso a los miembros que pongas en el .h que le des, pero estaras creando correctamente el objeto ya que lo hace tu libreria, espero que se entienda lo que quiero decir ;)
aqui ya te daba la solucion que usa en estos casos

senior wapo

 Olvidate de lo que ha dicho Shaq. NO puedes borrar nada en la cabecera. Lo que te haces es una clase proxy que simplemente guarde un puntero a la clase que envuelve.

Si borras los datos miembro ¿ como vas a reservar espacio para ellos (new) si no sabes su tamaño real?
¿ Y si hay funciones virtuales y el compilador guarda el puntero a la vtable al final del objeto en lugar de al principio ? (Gcc anterior al 2.8 por ejemplo).
¿ Y si tienes funciones inline que acceden a datos publicos que an despues de los que has borrado ? El compilador del usuario pensará que el dato está al principio del objeto en lugar de 324 bytes más adelante.

Si le ha funcionado es porque el compilador no ha instanciado código inline que acceda a datos, y de haber clases virtuales, el puntero a la table lo metía al principio (VC++ o gcc de los de ahora). Y me supongo que no era una clase con polymorfismo, o peor, herencia multiple. Vamos, que ha sido más casualidad que otra cosa :)


Pogacha

 Eso sospechaba, pero estas seguro?

Nunca vi antes eso de la clase proxy, que ventaja tendria contra este sistema:

Lib:
class Verdadera : public Trucha
{
   int j, k;
 public:
   int x, y;
  Verdadera();
  ~Verdadera();
  MisFunciones();
};

Trucha *Crear_Trucha() { return new Verdadera; }


Usuario:
class Trucha {
public:
  virtual ~Trucha();
  virtual MisFunciones();
};

INPORTAR Trucha *Crear_Trucha();


Pregunto por ignorancia, que no se me malinterprete, escribo el codigo para poder expresar bien lo que quiero decir ... con clases virtuales trabajaba ya en dlls de esta manera pero supuse que para libs deberia haber algo mas sencillo...

_Grey

 
CitarNunca vi antes eso de la clase proxy, que ventaja tendria contra este sistema
...

Esto de las clases proxy es lo "habitual", es la solucion que encontraras en los libros de C++ que trater la ocultacion de codigo.

Que ventajas tiene en comparacion con una interface??
Eso ya depende de ti, si usas una interface necesitaras de funciones especiales para la creacion del objeto y la liberacion de este, ademas de la carga de las funciones virtuales. Con la clase proxy, el objeto seguira comportandose como un objeto, lo puedes crear normalmente y esperar que se destruya al final de la funcion sin mas, salvo de ser dinamico, y te salvas de la carga de funciones virtuales, puesto que solo haces una llamada al objeto real dentro de cada funcion, que con un inline es como si la pones en la llamada a la funcion de proxy.
Si te interesa un OBJETO, clase proxy.

Saludos.

senior wapo

 A menos que tengas respuestas para las preguntas (retóricas) que he puesto, pues si, estoy seguro :D

Lo que tu pones, usando polimorfismo, es otra forma de hacerlo Supongo que la más elegante en la mayoria de los casos ().

La idea es no borrar nada de la declaración de clase.

Pogacha







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.