Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Можно ли? / 14 сообщений из 14, страница 1 из 1
23.04.2004, 19:19
    #32495024
tors
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли?
Можно ли каким нибедь хитрым образом получить доступ к privet- или protecterd- свойству не переделывая его?
Сомнительно конечно, ну а вдруг!!!
C ув. Tors
...
Рейтинг: 0 / 0
23.04.2004, 19:40
    #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
26.04.2004, 12:22
    #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
26.04.2004, 21:10
    #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
26.04.2004, 23:35
    #32497678
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли?
Есть стандартный способ узнать смещение члена данных - offsetof. Только для этого член данных должен быть объявлен в секции public. Так что, struct_by_field, как и offsetof мимо кассы в условиях первоначального поста.
...
Рейтинг: 0 / 0
27.04.2004, 00:13
    #32497688
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли?
--Анатолий Широков

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

torsполучить доступ к privet- или protecterd- свойству
...
Рейтинг: 0 / 0
27.04.2004, 11:14
    #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
27.04.2004, 17:07
    #32499206
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли?
2Анатолий Широков
Отсюда следует, что приведенным тобой способ получить доступ к приватному или защищенному члену данных не в кассу.

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

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

struct A
{
private:
int a;
};

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

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

A a;
C *p = (C *)(void *)&a;
p->a = 10;
...
Рейтинг: 0 / 0
27.04.2004, 18:15
    #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
27.04.2004, 18:25
    #32499344
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли?
2 Lepsik

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

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

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

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

2 well_wisher_

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

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

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

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

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


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

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

Без обид.
...
Рейтинг: 0 / 0
27.04.2004, 20:18
    #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
28.04.2004, 11:45
    #32500180
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли?
2 Lepsik & А.Ш.
Тока меня не бейте!

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

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

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


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