Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает dynamic_cast, С++ Builder 
:(
    Опции темы
gray_k
Дата 26.6.2003, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 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.
PM MAIL   Вверх
Vyacheslav
Дата 26.6.2003, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Ты, случаем, в проекте RTTI не задисейблил(Project->Options->C++->Enable RTTI)


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
gray_k
Дата 26.6.2003, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



Нет, включено.


--------------------
С уважением.
Gray.
PM MAIL   Вверх
DENNN
Дата 26.6.2003, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



А если static_cast что напишет?
PM ICQ   Вверх
Vyacheslav
Дата 26.6.2003, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Еще предположение: не из dll(в dll) передашь DataSet?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
gray_k
Дата 27.6.2003, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: нет
Всего: 22



Извините, ошибся. Когда делаешь
TIBQuery *ds;
ds = dynamic_cast<TIBQuery*>(Sender);
и передаешь указатель на IBQuery то всё работает.
Когда же пытаешься привести к IBDataSet, то не работает. Явное приведение - ds = (TIBDataSet*)Sender работает.
Нет DataSet передаю не из dll.
а static_cast будет работать всегда, независимо от того, можно ли привести Sender к IBDataSet или нельзя.




--------------------
С уважением.
Gray.
PM MAIL   Вверх
Vyacheslav
Дата 27.6.2003, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



А ты иерархию смотрел?
TDataSet<-TIBCustomDataSet<-TIBQuery
TDataSet<-TIBCustomDataSet<-TIBTable
Где у тебя здесь TIBDataSet? Он стоит отдельной цепочкой.
TDataSet<-TIBCustomDataSet<-TIBDataSet
Естественно dynamic_cast тебе правильно показывает. А статическое приведение в этом случае чревато последствиями




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
vickr
Дата 27.6.2003, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 13.5.2003
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата
А ты иерархию смотрел?

Пардон, а де тут отдельная цепочка?
Что TIBQuery, что TIBDataSet - оба потомки TIBCustomDataSet. Или я что-то не понимаю?
C InterBase - компонентами сам не работал, но сам первым делом полез в Help за иерархией и увидел то же самое
Цитата
TDataSet<-TIBCustomDataSet<-TIBQuery
...
...
TDataSet<-TIBCustomDataSet<-TIBDataSet

То Vyacheslav:
Объясни, пожалуйста, что не так. withstupid.gif
А то придется звонить Страуструпу smile.gif
--------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:)
PM MAIL   Вверх
Vyacheslav
Дата 27.6.2003, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Страструпу звонить незачем. Сами разберемся
Так gray_k пытается приводить TIBQuery и TIBTable к TIBDataSet, а не к TIBCustomDataSet.
dynamic_cast - это типобезопасное приведение, следовательно приведение должно быть типобезопасно. TIBQuery ( TIBTable ) и TIBDataSet - это совершенно разные типы. Допустим такое преобразование возможно . Тогда мы сможем получить следующее
Код

class A
{
public:
  virual Vfunc(){out<<"VA";};
};

class B: public A
{
public:
  virual Vfunc(){out<<"VB";};
};

class C: public A
{
public:
  virual Vfunc(){out<<"VC";};
   int c
};


B b; C c;
A* pa = dynamic_cast<A*>(&b); //это будет выполняться при компиляции
C* pc = dynamic_cast<C*>(pa); //это будет выпоняться в рантайме
if (pc) pc.c = 5;

Если бы преобразование pc = dynamic_cast<C*>(pa) выполнилось, то я тут же на pc.c = 5 получил бы Access Violation.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
vickr
Дата 27.6.2003, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 13.5.2003
Где: Санкт-Петербург

Репутация: нет
Всего: нет



To Vyacheslav
Разобрался, спасибо (давно не заглядывал в первоисточники).

Это сообщение отредактировал(а) vickr - 27.6.2003, 16:17
--------------------
Каждую секунду, тыкая в клавиши, мы давим насмерть не менее 1000 микробов =:)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.