powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Можно ли?
14 сообщений из 14, страница 1 из 1
Можно ли?
    #32495024
tors
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли каким нибедь хитрым образом получить доступ к privet- или protecterd- свойству не переделывая его?
Сомнительно конечно, ну а вдруг!!!
C ув. Tors
...
Рейтинг: 0 / 0
Можно ли?
    #32495041
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К protected членам можно обратится, если отнаследоваться от интересуемого класса публично - правда, только из функций-членов наследника.

Можно с помощью хаков типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
struct A
{
private:
     int a;
};

struct B
{
private:
     int a;
};
...
A a;
B* b = (B*)&a;
b->a =  10 ;


Можно, так же, влезть в интерфейс и "вероломно" вписать друга. А чтобы никто не заметил поменять тайм стамп файла на исходный - правда, от бдительного ока CVS не спасет.

На худой конец, совершить преступление перед человечеством (это нарушение стандарта):

Код: plaintext
1.
#define protected public
#define private public
...
Рейтинг: 0 / 0
Можно ли?
    #32496534
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дебагером надо посмотреть сдвиг.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
class P
{
public:
 int i;
private:
 int j;

public:
 void Setj(int nj){j=nj;};
};



P *p = new P;

p->i =  3 ; //Ok
p->Setj( 4 );

*(((int*)p)+ 1 ) =  5 ; // ура!
...
Рейтинг: 0 / 0
Можно ли?
    #32497607
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно и без дебагера

#define func(ptr) struct_by_field(ptr, struct s, a)

#define struct_by_field(ptr, type, name) \
((type *)((char*)(ptr)-(unsigned long)(&((type*)0)->name)))
...
Рейтинг: 0 / 0
Можно ли?
    #32497678
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть стандартный способ узнать смещение члена данных - offsetof. Только для этого член данных должен быть объявлен в секции public. Так что, struct_by_field, как и offsetof мимо кассы в условиях первоначального поста.
...
Рейтинг: 0 / 0
Можно ли?
    #32497688
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Анатолий Широков

ты похоже так и не прочитал первоначальный пост

torsполучить доступ к privet- или protecterd- свойству
...
Рейтинг: 0 / 0
Можно ли?
    #32498155
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Lepsik

А ты мой пост не понял:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
struct foo {
public:
   // куча всякой муры
private:
    int i;
};

size_t oi = offsetof(foo, i);



Этот код не скомпилируется.

Отсюда следует, что приведенным тобой способ получить доступ к приватному или защищенному члену данных не в кассу. Теперь понятно?
...
Рейтинг: 0 / 0
Можно ли?
    #32499206
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Анатолий Широков
Отсюда следует, что приведенным тобой способ получить доступ к приватному или защищенному члену данных не в кассу.

все таки головой иногда следует думать. копи-паст не каждому пойдет на пользу.

Но есть еще более простой способ.

struct A
{
private:
int a;
};

struct C // дубликат класса без обьявления секций доступа
{
int a;
};

.......................

A a;
C *p = (C *)(void *)&a;
p->a = 10;
...
Рейтинг: 0 / 0
Можно ли?
    #32499329
well_wisher_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Анатолий Широков
Код: plaintext
1.
2.
3.
4.
struct B
{
private: // скорее всего очепятка, надо читать public: ы?
     int a;
};


2 Lepsik

Код: plaintext
1.
C *p = (C *)(void *)&a; // чем вот это
B* b = (B*)&a;          // лучше этого :xz:


PS. Всё таки не хватает на этом сайте, отметок за посты, а то бы я кое-кому влепил пару минусов ;o)
...
Рейтинг: 0 / 0
Можно ли?
    #32499344
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Lepsik

авторвсе таки головой иногда следует думать. копи-паст не каждому пойдет на пользу.

Ты это себе, приветствую самокритику:)

авторНо есть еще более простой способ.

Похоже, что это ты читаешь только последние посты в треде.

2 well_wisher_

Нет, не опечатка. Это я показывал Lepsik-у, что получить смещение приватного и защищенного члена не удастся - ведь именно такой способ предлагался им, чтобы потом воспользовавшишь смещением поместить туда значение.
...
Рейтинг: 0 / 0
Можно ли?
    #32499419
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2Анатолий Широков

мой первый пост в добавление СЕМь чтобы не лазить отладчиком.
и ежу понятно что простых способов нет.

А умная ирония над всеми что все типа дураки, а я один на коне тут типа не совсем уместна.
...
Рейтинг: 0 / 0
Можно ли?
    #32499431
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аггрессивный способ вести диалог навязан Вами, поэтому пеняйте сами на себя, а не приписывайте мне "умную ирония" - Вы спутали причину со следствием. Внимательно перечитайте ведь тред:

СЕМь предложил в дебаггере узнать смещение члена - то есть опытным путем
определить смещение приватного члена. На что Вы отвечаете "можно и не в дебаггере" и приводите макрос получения смещение члена, который работает только для публичныйх членов класса - Ваша поправка показалась мне не логичной в контексте основного вопроса вот я и поспешил Вас поправить. На что Вы очень оскорбились и предложили мне перечитать первоначальный вопрос. Теперь же Вы утверждаете буквально следующее:7

Код: plaintext
1.
мой первый пост в добавление СЕМь чтобы не лазить отладчиком. 
и ежу понятно что простых способов нет. 


Не стыкуется как-то - с одной стороны, Вы отсылаете меня перечитать вопрос (типа, дурик, какого ты здесь выступаешь, я знаю, что я говорю), а с другой стороны, оказывается, Вы только лишь поправляли СЕМь!!!

Короче, "спаси себя сам и рядом спасутся тысячи", аминь:)

Без обид.
...
Рейтинг: 0 / 0
Можно ли?
    #32499449
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 well_wisher_

Точно, прошу прощения, ведь речь шла о первоначальном пример. Тогда да, конечно, там так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
struct A
{
private:
     int a;
};

struct B
{
< --private: // убрать, конечно
 
     int a;
};
...
A a;
B* b = (B*)&a;
b->a =  10 
;
...
Рейтинг: 0 / 0
Можно ли?
    #32500180
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Lepsik & А.Ш.
Тока меня не бейте!

А вообще приватность/не_приватность - разбор компилятора. Чтоб не мучиться надо компилятор переправить :)

Есть камень в дублировании класса: надо ещё проверить, какой способ упаковки данных в классе стоит... (Хотя, может я и не прав, может при касте с класса на класс выравнивание делается автоматически, расскажите, кто знает).

Ещё слышал я про динамическое создание классов. Но не видел. Вот если такая штука есть, то можно, наверно, пробовать генерить на ходу "public"-класс и написать макрос для доступа через него к нужному классу. Но тут опять же надо как-то на ходу получать информацию о данных этого класса.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Можно ли?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]