Можно ли получить доступ к частным членам класса?

StackOverflow https://stackoverflow.com/questions/729363

  •  05-09-2019
  •  | 
  •  

Вопрос

Можно ли получить доступ к частным членам класса в С++.

при условии, что у вас нет функции друга, и у вас нет доступа к определению класса

Это было полезно?

Решение

Вы имеете в виду использование некоторой арифметики указателей для получения доступа?Это возможно, но определенно опасно.Взгляните также на этот вопрос: Доступ к частным членам

Другие советы

Я думаю, что был какой-то старый школьный трюк вроде этого:

#define private public
#include "header.h"
#define private private

Но вам настоятельно не рекомендуется это делать (я быстро прочитал, что об этом что-то сказано в стандарте C++) - если вы хотите узнать больше об этом, гуглите для "#define Private Public"

Ну, возможно, я говорю чушь, но я думаю, что вы могли бы попытаться определить класс-близнец с теми же членами, что и класс, который вы хотите изменить, но с разными модификаторами public/private, а затем использовать reinepret_cast для приведения исходного класса к вашему, в котором вы может получить доступ к частным членам.

Это немного хакерски ;-)

Немного кода, поясняющего идею:

class ClassWithNoAccess 
{
public:
  someMethod();

private:
  int someVar;
};

class ClassTwin 
{
public:
  someMethod();

public:
  int someVar;
}

и где-то в коде:

ClassWithNoAccess* noAccess = new ClassWithNoAccess();
ClassTwin* twin = reinterpret_cast<ClassTwin *>(noAccess);
twin->someVar = 1;

редактировать:так что, как кто-то уже писал раньше, это может работать, но стандарт не гарантирует, что порядок переменных с модификатором public и Private будет одинаковым

Даже если бы это было возможно через какой -то неприятный взлом - см. Ранние посты - вы не должны этого делать.

Инкапсуляция существует с очень хорошей целью, и установка члена класса как частного означает, что разработчик не хотел, чтобы кто-то возился с этим членом.Это должно означать

«Вам не обязательно иметь доступ к этому участнику, чтобы использовать публичный интерфейс в полной мере»

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top