Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Указатель this и данные класса  (Прочитано 12997 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Predicate
Гость
« : 25-09-2004 21:33 » 

Подскажите пожалуйста, можно ли получить указатель на данные класса, пропуская таблицу виртуальных функций?
Просто способ "(PCHAR)this + 4" не совсем прикольный... Может можно по другому?
Записан
Serega
Гость
« Ответ #1 : 26-09-2004 06:02 » 

Насколько я понимаю ты пытаешься сделать это в методе класса, раз уж используешь this
Тогда просто бери адрес данных и все
Код:
class Foo
{
int data;
public:
int* getDataPtr()
{
return &data;
}
};
« Последнее редактирование: 01-12-2007 16:31 от Алексей1153++ » Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #2 : 26-09-2004 07:59 » 

Находясь в классе не очень понятно зачем брать адресс через функцию...
Пиши просто &data получишь указатель на переменную.

ИМХО очень странный вопрос...
Записан

А птичку нашу прошу не обижать!!!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 26-09-2004 10:48 » 

Ага, странный, я даже с разгону-то и не понял, что Predicate имел в виду спросить Улыбаюсь

Predicate, ты лучше цель расскажи, а то может просто ты объяснил нам задачу не так
Записан

Predicate
Гость
« Ответ #4 : 26-09-2004 21:47 » new

Ну да... на самом деле понятно, что можно взять адрес первого члена в классе. Возможно тут я тупанул чуток... Просто имелось в виду можно ли это сделать не привязываясь к конкретным именам переменных... хотя возможно это и не надо...
Записан
Serega
Гость
« Ответ #5 : 27-09-2004 04:57 » 

Это точно не надо, класс знает о том какие у него есть переменные и другим взяться неоткуда
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #6 : 04-10-2004 12:15 » 

Все переменные "хранятся" в начале класса, но нельзя заранее точно определить, в каком порядке (точнее, можно, но это не стандартизовано).
Записан
grozny
Гость
« Ответ #7 : 14-10-2004 22:29 » 

>"хранятся" в начале класса...
>в каком порядке...
зависит в теории от компилятора, но this всегда показывает на первый член в тех компиляторах, с которыми имел дело, а данные всегда лежат в порядке объявления. Естественно, надо учитывать текущее выравнивание (man pragma pack).

class C
{
int d1;
int d2;
public:
void digThis();
}

void C::digThis()
{
int dd1=*(int*)this; //dd1=d2
int dd2=*((int*)this+1); //dd2=d2
}

Снаружи:
C obj;
int dd1=*(int*)&obj; //dd1=d2
int dd2=*((int*)&obj+1); //dd2=d2
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #8 : 20-10-2004 09:56 » 

А как с множественным наследованием? Отлично  Отлично  Отлично
Записан
grozny
Гость
« Ответ #9 : 20-10-2004 21:43 » 

Цитата: Migmile
А как с множественным наследованием? Отлично  Отлично  Отлично


По распорядку, согласно стандарту языка и документации на компилятор.  8)  Ага

Проверяется в 5 мин. Как правило (т.е. на тех компиляторах, которыми пользовался), данные-члены складываются в порядке наследования.

Хочу отметить, что при наличии виртуального и/или множественного наследования пользоваться подобными трюками с this - извращение. Это верный знак, что либо типы данных либо алгоритмы неоптимальны. Так же помогает медитация на тему "С++ как оптимальный язык для данной задачи и не стоит ли перейти на ассемблер или мож пора на пенсию".
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #10 : 21-10-2004 07:38 » 

Медетировать на пенсию на Багамах?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines