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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: грабли  (Прочитано 26713 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

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


« : 16-10-2007 10:13 » 

Код:
struct A
{
int a1;
int a2;

void Fa()
{
a1=1;
a2=2;
}
};


struct B:public A
{
int b1;
int b2;
B()
{
((A)(*this)).Fa();// 1) в Fa this другой
((A*)this)->Fa();// 2) в Fa this такой же
Fa();//3) тут нет извратов ))
}

};

void F()
{
  B b;
  int iii=1;
}

почему в конструкции 1) внутрь функции передаётся указатель не this , а какое то другой значение?
в  2) и 3) всё как обычно

там объект что ли создаётся ? Не пойму только как )))

ибо присвоение
Код:
A aaa;
aaa=((A)(*this));
проходит нормально
« Последнее редактирование: 13-11-2007 05:02 от Алексей1153++ » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 16-10-2007 10:36 » 

Ничего не понял... Где указатель передаётся в ф-ю? Что значит "this-такой, this-другой"?

Давай-ка по-понятней.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #2 : 16-10-2007 10:59 » 

Джон, вот тут:

Код:
//тут this == 0x01234567
((A)(*this)).Fa(); -> (когда зашли в функцию, смотрим там this -
 он уже не равен 0x01234567 , соответственно работа идёт не с
 тем объектом, каким хочется)

а тут
Код:
//тут this == 0x01234567
((A*)this)->Fa(); -> (когда зашли в функцию, смотрим там this - он
 по прежнему равен 0x01234567)
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 16-10-2007 12:54 » 

Всё правильно. Это не преобразование, а чёрт знает что. Ага Я думаю, что это не вылетает только потому, что в дебуггере и никаких серьёзных операций с данными не происходит.

Код:
B()
{
printf("1 a1=%d;a2=%d\n", a1, a2);
((A)(*this)).Fa();
printf("2 a1=%d;a2=%d\n", a1, a2);
((A*)this)->Fa();
printf("3 a1=%d;a2=%d\n", a1, a2);
Fa();
printf("4 a1=%d;a2=%d\n", a1, a2);
}

1 и 2 покажут мусор. Те это не поля этого объекта.

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #4 : 16-10-2007 14:57 » 

ну эт я понял, что поля не его...

а вот почему компилятор пропустил, либо что это за выражение получилось ?
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 16-10-2007 15:36 » 

А компилятору по барабану. Некий кусок памяти кастится под определённую схему. Посмотри, у тебя там всего два целых поля. Дебуггер всегда выделяет место с запасом плюс ещё обнуляет всё.
Те ничего страшного не происходило. В реальной ситуации это должно вылететь с ошибкой доступа к памяти.

А нафига тебе вобще такое понадобилось? Ну кастинг указателя это я ещё могу понять (не совсем правда - this в родительский класс - это изврат ИМХО). Но пытаться вытащить что-то что по указателю, ещё даже не создано до конца объекта...  представь что твоя ф-я Fa() вызывает некую чисто виртуальную ф-ю, которая будет переписана в В и работает с мемберами В, которые будут проинициаллизированы в конструкторе, после вызова Fa() (ну блин загнул) Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #6 : 16-10-2007 15:44 » 

Джон, прикинь, не вылетало...  Функция обнуляла кусок тела B , который (кусок) является A ) Только обнулялось нехристь что, но не вылетало , как не странно.
Написал так (вариант 1) не знаю почему )) Очень торопился, босс подгонял, вот и выдал шедевр ))) Потом я понял, что был пьян , переписал. А потом понял, что достаточно вообще просто вызвать функцию, привата там не было, доступ прямо из B есть
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 16-10-2007 18:09 » 

С невылетанием повезло. Может в этот момент и резервируется кусок памяти нужных размеров где-то, только ты его уже не достанешь. ХОтя можно попробовать.
А так конечно есть доступ, тем более что у тебя там всё паблик. Поэтому я и не въехал зачем тебе это всё надо было. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #8 : 16-10-2007 18:25 » 

Джон, достать ту память элементарно - пусть Fa() вернёт  указатель:
Код:
void* Fa()
{
   return this;
}

мне больше интересен механизм - что же это было ? )))) Что именно создалось, по каким законам языка
Записан

nop
Гость
« Ответ #9 : 23-10-2007 06:14 » 

мне больше интересен механизм - что же это было ? )))) Что именно создалось, по каким законам языка

Был создан временный объект, инициализированный подобъектом A, время жизни которого ограничено полным выражением. Эквивалентно A(*this).Fa();


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

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


« Ответ #10 : 23-10-2007 06:24 » 

nop, (*this).Fa(); - это я понимаю, а имя класса перед выражением - это же синтаксическая ошибка вроде

или тут имеется в виду - создать экземпляр класса A , инициализировать его текущим (*this) экземпляром класса B (обрезав его до A) и вызвать у нового объекта A метод Fa ? Но тогда опять нестыковка - указано же преобразование типа - (A)
« Последнее редактирование: 23-10-2007 06:27 от Алексей1153++ » Записан

Anchorite
Гость
« Ответ #11 : 23-10-2007 12:59 » 

Алексей1153++, ради интереса добавь в конце структуры A следующие строки и попробуй скомпилировать.

Код:
    A() {}

    private:
       A(const A&);


Думаю вопросы отпадут сами собой.
« Последнее редактирование: 23-10-2007 13:13 от Anchorite » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #12 : 23-10-2007 13:20 » 

да уж, я угадал. Только приват не срабатывает - конструктор вызывается (я протрассировал). И точно - адрес уже левый, то есть это временный безымянный объект.
А вообще - неприятно, почему такой конструктор есть по умолчанию ?
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 23-10-2007 14:45 » 

Алексей1153++, он всегда был. В C++ есть 2 конструктора по умолчанию: "X()" - конструктор создания и "X(const X &)" - конструктор копирования.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #14 : 25-10-2007 05:23 » 

Народ ну вы чего?

что делает этот код?
Код:
((A)(*this)).Fa();
1. разименование this
2. конструирование объекта A из объекта *this аналогично строчке A a(*this) только тут временный объкт
3. далее вызов функции


что делает этот код?
Код:
((A*)this)->Fa()
1. приводим указатель this к типу указателя на базовый класс
2. вызываем функцию

это эквивалентно строке A::Fa(); т.е. вызов функции не дочернего, а родительского класса

что касается конструкторов, дефолтовый конструктор и конструктор копирования создаются компилятором если их не задали явно.
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #15 : 25-10-2007 05:34 » 

LogRus, угу, я уже понял ошибку Улыбаюсь
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #16 : 25-10-2007 07:31 » 

Алексей1153++, а лень читать было, как-то всё пространно Улыбаюсь
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #17 : 25-10-2007 07:41 » 

LogRus, в смысле - лень читать ? Улыбаюсь
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #18 : 26-10-2007 09:14 » 

смысле буков много, пару постов почитал по диагонали и написал ответ Улыбаюсь
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #19 : 13-11-2007 05:05 » 

вот ещё грабли
залез в один свой старый код , и обнаружил там такое выражение
Код:
(BYTE*)&();

(в последних скобках была, видими, некая переменная, которую по неким причинам удалил Отлично  В общем, вопрос не в этом)

почему компилятор не ругается на эту конструкцию вообще никак ? Даже ворнинга нет

я бы ещё понял , если бы в конце пары скобок не было - это был бы просто тип. А со скобками ?

зы Собственно - какой нафик тип , вообще  непонятно что...
« Последнее редактирование: 13-11-2007 09:10 от Алексей1153++ » Записан

Anchorite
Гость
« Ответ #20 : 13-11-2007 08:06 » 

А у тебя в классе есть перегруженный operator  () ?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #21 : 13-11-2007 09:08 » 

Anchorite, нет такого:)

А если бы и был , нельзя же взять адрес у возвращаемого параметра
« Последнее редактирование: 13-11-2007 09:13 от Алексей1153++ » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #22 : 13-11-2007 09:39 » 

Лёшка, дык ёлы-палы. Сам настройки поменял и сразу Косой.

Ща только что проверил. И VS6, и VS .NET 2003, и VS 2005 все показывают синтаксическую ошибку.

error C2059: syntax error : ')'

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #23 : 13-11-2007 09:47 » 

какие же я настройки поменял ? Улыбаюсь

-----------
блин, всё , я понял причину Отлично

кусок кода, оказывается был вырезан дефайнами , поэтому компилятор и не реагировал на косяк , щас попробовал в "живом" куске - и точно, обламывает ))
« Последнее редактирование: 13-11-2007 09:49 от Алексей1153++ » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #24 : 13-11-2007 10:56 » new

"Неее, эт таксист спёр. Мне его рожа сразу не понравилась." (с) Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines