Estaba probando la validez del private
especificador de acceso en C++. Aquí va:C++ ¿Es privado realmente privado?
Interfaz:
// class_A.h
class A
{
public:
void printX();
private:
void actualPrintX();
int x;
};
Implementación:
// class_A.cpp
void A::printX()
{
actualPrintX();
}
void A::actualPrintX()
{
std::cout << x:
}
Construí esto en una biblioteca estática (.a/lib). Ahora tenemos un par class_A.h y classA.a (o classA.lib). Edité class_A.h y eliminé el private:
de él.
Ahora en otro classTester.cpp:
#include "class_A.h" // the newly edited header
int main()
{
A a;
a.x = 12; // both G++ and VC++ allowed this!
a.printX(); // allowed, as expected
a.actualPrintX(); // allowed by G++, VC++ gave a unresolved linker error
return 0;
}
Yo sé que después de la manipulación de cabecera de una biblioteca de todas las apuestas están apagadas (quiero decir, la integridad del sistema, etc.) Aunque el método siendo hacky, ¿es realmente ¿permitido? ¿Hay alguna manera de bloquear esto? ¿O estoy haciendo algo mal aquí?
Sé que el diseño de Cheshire Cat (Pimpl - impl. Privado implícito. Http://en.wikipedia.org/wiki/Cheshire_Cat_Idiom_%28programming_technique%29) es posible aquí y también que los especificadores de acceso son guardias de tiempo de compilación por el compilador . – legends2k
¿Por qué diablos no puedes simplemente reconstruirlo? –
@Dominic: Mi intención era ver qué sucede si intento acceder a partes privadas de una clase. – legends2k