Pregunta ¿Hay alguna forma de que pueda acceder a la variable de miembro privado de una clase?


¿Hay alguna forma de que pueda acceder a la variable de miembro privado de una clase?

Edición: No desde una función de miembro o función de amigo sino a través de una instancia.


9
2018-02-08 06:04


origen


Respuestas:


Simplemente agrúpalo, cambia la memoria y regresa. (no compiló el código, pero debería tener la idea).

class Bla
{
public:
    Bla() : x(15), str("bla") {}
private:
    int x;
    std::string str;
}

int main()
{
    Bla bla;

    int x = *((int*)(&bla));
    std::string str = *((std::string*)((int*)(&bla) + 1));

    std::cout << x << str;

    return 0;
}

Dado que esta es una pregunta de entrevista, no entraré en por qué no debes hacer eso. :)

EDITAR: Las clases con funciones virtuales también tendrán un puntero de tabla virtual en alguna parte. No estoy seguro si & le daré la dirección de vt o la dirección del primer miembro de datos.

La alineación es 4 por defecto (¿no?), Por lo que si el miembro que está leyendo no se alinea, cambie 2 bytes para pasar al siguiente.


5
2018-02-08 06:26



GotW # 76 tiene fascinantes detalles de lenguaje y abogacía sobre cómo hacer algunas de estas cosas. :-)


12
2018-02-08 06:28



Uno de los "trucos sucios" de C ++ es hacer algo como:

#define private public
#include "ClassHeader.h"

// now all the private members of the included class are public

yo fuertemente no lo recomiendo que haces esto


5
2018-02-08 06:06



Tú podrías:

  1. Coloque a los miembros privados en la sección pública
  2. Haga que su clase o función sea un amigo de la clase.
  3. Proporcione un acceso a los datos.
  4. Tome la dirección de la clase, agregue el desplazamiento a esa variable, molde y desreferencia. (Yuck)

¿Que estás tratando de hacer? Si algo es privado, no te metas con eso. Es privado por una razón.


5
2018-02-08 06:07



Sí. Puede acceder a un miembro privado:

  • ... dentro de otras instancias del mismo tipo (exacto).
  • ... dentro de las clases o funciones declaradas como amigo de esa clase.
  • ... a través de una función de miembro de acceso público (getter / setter).

3
2018-02-08 06:08



Si bien estamos proponiendo malas ideas, no hay nada en el extremo del código que haga cumplir la encapsulación, es completamente un truco de compilación, por lo que puede escribir el ensamblado para acceder directamente a los miembros privados.

Pero por qué no solo reescribir la clase base si no está haciendo lo que quieres ya?


2
2018-02-08 06:08



¿Por qué querrías?

Las reglas de visibilidad son claras:

  • los métodos privados deben ser accedidos solo por métodos de la clase
  • los métodos protegidos se pueden acceder por métodos de la clase o descendientes
  • cualquier persona puede acceder a los métodos públicos

... por lo tanto, si escribe la clase usted mismo, elija la visibilidad correcta. Si es una clase suministrada, cosa cuidadosamente por qué se hizo privado en primer lugar ...

Sin embargo, si decide romper esa regla, tiene varias opciones:

  • puede hacerse amigo de la clase que debe acceder a los métodos privados a través de un friend especificador
  • puedes usar un truco de preprocesador feo que probablemente alguien ya ha publicado, pero hazlo solamente si necesita usar los campos o métodos para realizar pruebas unitarias, cualquier otro uso es un mal diseño
  • puedes usar un truco feo de tipografía, pero es tan feo que incluso temo publicarlo para que no te decapiten;>

2
2018-02-08 06:09



Sí, por qué no, a través de una función de miembro


0
2018-02-08 06:05



Creo que depende de cómo se formule la pregunta:

P: ¿Cómo accedería a una variable miembro privada? R: No lo haría.

Junto con:

P: ¿Cómo implementarías ... R: No lo haría, ya está hecho, aprovecharía un framework / biblioteca existente.

Los entrevistadores no siempre quieren saber si usted puede hacer una rueda, a veces están sondeando para ver si usted sabe cómo encontrar la estación de servicio más cercana. :)


0
2018-02-09 01:22