Dado que se entiende incorrectamente, tengo que aclarar. Todas las siguientes soluciones no requieren la recompilación del objeto. Para usar una clase en su código, si está compilada en un archivo objeto, debe incluir un archivo de encabezado con la declaración de esa clase.
#include <class.h>
ObjectFoo instance;
Se es posible (pero peligroso a menos que usted tiene cuidado) para cambiar la cabecera (a) o copiar la cabecera a otro lugar y que incluyen cabecera (b), sin recompilar la clase en sí .
#include <class_fixed.h>
ObjectFoo instance;
su código, en el que incluyó la nueva cabecera se acaba pensar que dentro del archivo de objeto (que no se ha vuelto a compilar!) Se encontrará aplicación de la clase declarada como en class_fixed.h
. Si bien persiste la clase declarada como en class.h
. Si cambia las compensaciones de los miembros (agregue nuevos miembros, por ejemplo) en su nuevo encabezado, está muerto y el código no funcionará correctamente. Pero solo cambiar el acceso funciona bien. El código compilado no sabe sobre el acceso, esto solo importa en la compilación extraña.
Esto no siempre es perjudicial. En la vida cotidiana se encuentra con un cambio de este tipo cuando instala una nueva versión de una biblioteca en su sistema y no recompila todos los programas que dependen de ella. Pero se debe manejar con cuidado
Existen varias soluciones.
memcpy()
no lo hacen! No haga falta ya que la copia de objetos a veces se somete a una política específica impuesta por el diseñador de la clase. Por ejemplo, auto_ptr
s no se puede simplemente copiar: si copia el auto_ptr
y luego se ejecuta el destructor para ambos, intentará liberar la misma memoria dos veces y el programa se bloqueará.
Cambio private:
-public:
en la cabecera o con macro
Si su licencia lo permite, puede resolver su problema por editar el archivo de cabecera que viene con la implementación de la clase. Si el código fuente de la implementación (es decircpp-file de la clase) está bajo su control, no importa: cambiar de privado a público para miembros de datos (en el encabezado) es suficiente y funciona bien incluso si se le proporciona una biblioteca de solo binario que contiene una definición de clase. (Para las funciones miembro cambiar el acceso a veces cambia su nombre interno, pero para MSVS y GCC está bien.)
Adición de una nueva función getter
Si bien el cambio private
-public
es casi siempre bien (a no ser que se basan en tiempo de compilación específica comprobaciones que deben romper la compilación si la clase tiene cierto miembro accesible), la adición de la nueva función getter se debe realizar con cuidado. La función getter debe estar en línea (y por lo tanto definida en el archivo de encabezado de la clase).
reinterpret_cast
El reparto funciona bien si NO estás lanzando un puntero a la clase base dinámica (medios dinámicos "con funciones o bases virtuales") cuya instancia real en el momento de la fundición se pueden derivar de la clase en la pieza de código en particular.
protected:
Y por si acaso se le olvidó. C++ puede declarar miembros protected:
, es decir, accesibles solo para las clases derivadas de las dadas. Esto puede satisfacer tus necesidades.
¿Qué le parece la edición de la fuente? '// private:' funcionará bien;) – LiraNuna
Creo que quiere evitar que los usuarios de su clase entren en problemas (por lo tanto, los privados) y necesita implementar algo que no encaje realmente en el diseño actual. – jdehaan
Creo que no tienes el código, ¿no? –