![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
Есть функция
void MyF(TObject *Sender) { TIBDataSet *ds; ds = dynamic_cast<TIBDataSet*>(Sender); if(ds) { /*здесь код*/ } } так вот, когда я передаю любой датасет (IBTable, IBQuery), то код не выполняется. Кто подскажет почему. Если сделать явное приведение: ds = (TIBDataSet*)Sender; то всё работает. dynamic_cast не работает даже когда делаешь TIBQuery *ds; ds = dynamic_cast<TIBQuery*>(Sender); и передаешь указатель на IBQuery то тоже не работает. Не пойму почему. Вроде всё как в литературе и хелпе. -------------------- С уважением. Gray. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Ты, случаем, в проекте RTTI не задисейблил(Project->Options->C++->Enable RTTI)
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
Нет, включено.
-------------------- С уважением. Gray. |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
А если static_cast что напишет?
|
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Еще предположение: не из dll(в dll) передашь DataSet?
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: нет Всего: 22 |
Извините, ошибся. Когда делаешь
TIBQuery *ds; ds = dynamic_cast<TIBQuery*>(Sender); и передаешь указатель на IBQuery то всё работает. Когда же пытаешься привести к IBDataSet, то не работает. Явное приведение - ds = (TIBDataSet*)Sender работает. Нет DataSet передаю не из dll. а static_cast будет работать всегда, независимо от того, можно ли привести Sender к IBDataSet или нельзя. -------------------- С уважением. Gray. |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
А ты иерархию смотрел?
TDataSet<-TIBCustomDataSet<-TIBQuery TDataSet<-TIBCustomDataSet<-TIBTable Где у тебя здесь TIBDataSet? Он стоит отдельной цепочкой. TDataSet<-TIBCustomDataSet<-TIBDataSet Естественно dynamic_cast тебе правильно показывает. А статическое приведение в этом случае чревато последствиями -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| vickr |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 13.5.2003 Где: Санкт-Петербург Репутация: нет Всего: нет |
Пардон, а де тут отдельная цепочка? Что TIBQuery, что TIBDataSet - оба потомки TIBCustomDataSet. Или я что-то не понимаю? C InterBase - компонентами сам не работал, но сам первым делом полез в Help за иерархией и увидел то же самое
То Vyacheslav: Объясни, пожалуйста, что не так. А то придется звонить Страуструпу --------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:) |
||||
|
|||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Страструпу звонить незачем. Сами разберемся
Так gray_k пытается приводить TIBQuery и TIBTable к TIBDataSet, а не к TIBCustomDataSet. dynamic_cast - это типобезопасное приведение, следовательно приведение должно быть типобезопасно. TIBQuery ( TIBTable ) и TIBDataSet - это совершенно разные типы. Допустим такое преобразование возможно . Тогда мы сможем получить следующее
Если бы преобразование pc = dynamic_cast<C*>(pa) выполнилось, то я тут же на pc.c = 5 получил бы Access Violation. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| vickr |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 13.5.2003 Где: Санкт-Петербург Репутация: нет Всего: нет |
To Vyacheslav
Разобрался, спасибо (давно не заглядывал в первоисточники). Это сообщение отредактировал(а) vickr - 27.6.2003, 16:17 --------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:) |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |