¿Cómo acceder a miembros de datos privados fuera de la clase sin hacer “amigos”?

Tengo una class A como se menciona a continuación:

 class A{ int iData; }; 

No deseo crear la función de miembro ni heredar la class A anterior ni cambiar el especificador de iData .

Mis dudas:-

  • ¿Cómo acceder a iData de un objeto decir obj1 que es una instancia de class A ?
  • ¿Cómo cambiar o manipular el iData de un objeto obj1 ?

Nota : No use friend .

No puedes. Ese miembro es privado, no es visible fuera de la clase. Ese es el objective de los modificadores públicos / protegidos / privados.

(Sin embargo, probablemente puedas usar trucos de punteros sucios, pero supongo que entrarías en un territorio de comportamiento indefinido bastante rápido).

Aquí hay una manera, no recomendada, aunque

 class Weak { private: string name; public: void setName(const string& name) { this->name = name; } string getName()const { return this->name; } }; struct Hacker { string name; }; int main(int argc, char** argv) { Weak w; w.setName("Jon"); cout << w.getName() << endl; Hacker *hackit = reinterpret_cast(&w); hackit->name = "Jack"; cout << w.getName() << endl; } 

EDITAR:
Acabo de ver que editó la pregunta para decir que no quiere usar un amigo.
Entonces la respuesta es:

NO, no se puede, al menos, no de forma portátil, aprobado por el estándar C ++.


La parte posterior de la Respuesta fue anterior a la edición Q y la dejo aquí para beneficio de aquellos que quieran comprender algunos conceptos y no solo buscar una Respuesta a la Pregunta.


Si tiene miembros en un especificador de acceso privado, solo se podrá acceder a esos miembros desde dentro de la clase. No se permite el acceso externo.

Un ejemplo de código fuente:

 class MyClass { private: int c; public: void doSomething() { c = 10; //Allowed } }; int main() { MyClass obj; obj.c = 30; //Not Allowed, gives compiler error obj.doSomething(); //Allowed } 

Una solución: friend para rescatar
Para acceder al miembro privado, puede declarar una función / clase como amigo de esa clase en particular, y luego se podrá acceder al miembro dentro de esa función u objeto de clase sin verificación de especificador de acceso.

Muestra de código modificado:

 class MyClass { private: int c; public: void doSomething() { c = 10; //Allowed } friend void MytrustedFriend(); }; void MytrustedFriend() { MyClass obj; obj.c = 10; //Allowed } int main() { MyClass obj; obj.c = 30; //Not Allowed, gives compiler error obj.doSomething(); //Allowed //Call the friend function MytrustedFriend(); return 0; } 

Mala idea, no lo hagas nunca, pero aquí es cómo se puede hacer:

 int main() { A aObj; int* ptr; ptr = (int*)&aObj; // MODIFY! *ptr = 100; } 

http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html

el blog de este tipo te muestra cómo hacerlo usando plantillas. Con algunas modificaciones, puede adaptar este método para acceder a un miembro de datos privados, aunque me pareció complicado a pesar de tener más de 10 años de experiencia.

Quería señalar, como todos los demás, que hay muy pocos casos en los que hacer esto sea legítimo. Sin embargo, quiero señalar uno: estaba escribiendo pruebas unitarias para un paquete de software. Una agencia reguladora federal requiere que cada línea de código sea ​​ejercida y probada, sin modificar el código original. Debido al diseño pobre (en mi humilde opinión), una constante estática estaba en la sección “privada”, pero necesitaba usarla en la prueba unitaria. Entonces el método me pareció la mejor manera de hacerlo.

Estoy seguro de que el camino podría simplificarse, y estoy seguro de que hay otras formas. No estoy publicando esto para el OP, ya que han pasado 5 meses, pero espero que esto sea útil para un futuro empleado de Google.

amigo es tu amigo

 class A{ friend void foo(A arg); int iData; }; void foo(A arg){ // can access a.iData here } 

Si lo haces con regularidad, probablemente deberías reconsiderar tu diseño.

Comience a hacer friend de la class A p.ej

 void foo (); class A{ int iData; friend void foo (); }; 

Editar :

Si no puede cambiar el cuerpo de la class A , entonces A::iData no es accesible con las condiciones dadas en su pregunta.

iData es un miembro private de la clase. Ahora, la palabra private tiene un significado muy definido, tanto en C ++ como en la vida real. Significa que no puedes tocarlo . No es una recomendación, es la ley. Si no modifica la statement de clase, no podrá manipular a ese miembro de ninguna manera, forma o forma.

No hay forma legítima de que puedas hacerlo.

Es posible acceder a los datos privados de la clase directamente en la función principal y de los demás …

aquí hay un pequeño código …

 class GIFT { int i,j,k; public: void Fun() { cout<< i<<" "<< j<<" "<< k; } }; int main() { GIFT *obj=new GIFT(); // the value of i,j,k is 0 int *ptr=(int *)obj; *ptr=10; cout<<*ptr; // you also print value of I ptr++; *ptr=15; cout<<*ptr; // you also print value of J ptr++; *ptr=20; cout<<*ptr; // you also print value of K obj->Fun(); } 

En C ++, ¡casi todo es posible! Si no tiene forma de obtener datos privados, entonces tiene que hackear. ¡Hazlo solo para probar!

 class A { int iData; }; int main () { A a; struct ATwin { int pubData; }; // define a twin class with public members reinterpret_cast( &a )->pubData = 42; // set or get value return 0; } 

acceder a miembros privados fuera de clase … solo con fines de estudio … Este progtwig acepta todas las condiciones siguientes “No deseo crear funciones miembro para la clase superior A. Y tampoco quiero heredar la clase anterior A. I no quiero cambiar el especificador de iData “.

// aquí la función miembro se usa solo para ingresar y generar los valores privados … // void hack () se define fuera de la clase …

 //GEEK MODE....;) #include #include class A { private :int iData,x; public: void get() //enter the values {cout<<"Enter iData : "; cin>>iData;cout<<"Enter x : ";cin>>x;} void put() //displaying values {cout<>hck; //enter the value assigned for iData or x for(int i=0;i<5;i++) {ptr++; if(*ptr==hck) {cout<<"Private data hacked...!!!\nChange the value : "; cin>>*ptr;cout<