Можно ли получить доступ к закрытым членам класса? - PullRequest
4 голосов
/ 08 апреля 2009

Возможно ли получить доступ к закрытым членам класса в c ++.

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

Ответы [ 4 ]

8 голосов
/ 08 апреля 2009

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

6 голосов
/ 08 апреля 2009

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

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

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

2 голосов
/ 08 апреля 2009

Даже если бы это было возможно через какой-то неприятный хак - см. Предыдущие посты - вы ДОЛЖНЫ не делай этого.

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

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

2 голосов
/ 08 апреля 2009

Что ж, я могу говорить о чепухе, но я думаю, что вы могли бы попытаться определить "двойной" класс с теми же членами, что и класс, который вы хотите изменить, но с другими модификаторами public / private, а затем использовать reintepret_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;

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

...