Russian Qt Forum
Ноябрь 24, 2024, 00:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 ... 6   Вниз
  Печать  
Автор Тема: Как узнать о типе, до выполнения dynamic_cast?  (Прочитано 34435 раз)
Eten
Гость
« : Март 05, 2011, 06:35 »

В С# у меня с этим проблем не было, т.к. делал все через интерфейсы и у них была возможность сделать проверку перед преобразованием в производный. Точнее я делал преобразование базового типа в интерфейс, а уже потом интерфейсом проверял, могу ли я преобразовать. А также я мог с помощью такой проверки сделать разветвление для преобразования в тот тип, который содержит базовый. Например в Qt я могу использовать QVariant и у него canConvert<NNumeric> (например для проверки на тип NNumeric).

Т.е. NDataTypes является базовым по отношению к производным NNumeric, NString, NLogical.

Код:
void NEngine::Writeln(qint32 ID)
{
    NDataTypes* dt = new NDataTypes();
    QString str;
   
    if (ID == 0)
    {
        dt = this->StackValue.pop();
    }
    else
    {
        dt = this->Variables[ID-1];
    }

    if (variant.canConvert<NNumeric>()) {
        NNumeric* numeric = dynamic_cast<NNumeric*>(dt);
        str = QString(numeric);
    }

    if (variant.canConvert<NString>()) {
        NString string = dynamic_cast<NString*>(dt);
        str = string.Value();
    }

    if (variant.canConvert<NLogical>()) {
        NLogical logical = dynamic_cast<NLogical*>(dt);
        QString string;
        if (logical.Value())
        {
            string = "true";
        }
        else
        {
            string = "false";
        }
        str = string;
    }

    this->Screen.setText(this->Screen.Text()+str+"<br\>");
}

В условии с ID, dt передаются указатели, т.е. NDataTypes*. У меня вопрос такой, что нужно написать вместо variant.canConvert<NNumeric>() для проверки на тип, чтобы в случае истины выполнить преобразование в NNumeric и выполнить дальнейшие действия?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Март 05, 2011, 10:11 »

Советую срочно почитать литературу по с++. Вижу непонимание базовых классов и принципов наследования.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
_govorilka
Гость
« Ответ #2 : Март 05, 2011, 10:38 »

Посмотрите исходник, как там реализована функция FwMLNode::cast<>(). Возможно, это вам поможет:
http://code.google.com/p/fireworks/source/browse/src/fwcore/fwml.h

Хотя Бьярн Страустрап, наверное поможет больше Подмигивающий...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Март 05, 2011, 11:39 »

Код:
    if (variant.canConvert<NNumeric>()) {
        NNumeric* numeric = dynamic_cast<NNumeric*>(dt);
...

В условии с ID, dt передаются указатели, т.е. NDataTypes*. У меня вопрос такой, что нужно написать вместо variant.canConvert<NNumeric>() для проверки на тип, чтобы в случае истины выполнить преобразование в NNumeric и выполнить дальнейшие действия?
Ну намудрили, просто так

Код
C++ (Qt)
NNumeric* numeric = dynamic_cast<NNumeric*>(dt);
if (numeric != NULL)     // Ok, приведен
 ...
else      // это не NNumeric
...
 
Заметим что возвращаемый указатель numeric может быть и не равен dt, более того, тип указателя dt может и не наследовать NNumeric

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Март 05, 2011, 11:53 »

Цитировать
Чрезмерное применение понижающего приведения может служить признаком слишком бедного интерфейса базового класса
(А. Александреску, Г.Саттер)
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 05, 2011, 12:09 »

Цитировать
Чрезмерное применение понижающего приведения может служить признаком слишком бедного интерфейса базового класса
(А. Александреску, Г.Саттер)
А что такое "понижающее приведение"? Судя по (тщательно заучиваемой) сентенции теоретиков это приведение базового типа к наследуемому, и вернее было бы назвать "повышающее". Ну так в данном примере об этом речи нет. Да и "может служить" не вызывает доверия. Ведь может и "не служить"
Записан
Eten
Гость
« Ответ #6 : Март 05, 2011, 12:13 »

Советую срочно почитать литературу по с++. Вижу непонимание базовых классов и принципов наследования.
В том то вся и проблема, что я еще вчера это сделал. Но вот про dynamic_cast ничего не нашел путного, тем более у Бьерна, что очень странно. Но видать не до конца разобрал или что-то упустил из внимания.  Подмигивающий
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Март 05, 2011, 12:19 »

Igors, хватит спорить только ради того, чтобы спорить. Я просто процитировал двух человек, которые в с++ разбираются намного лучше нас с тобой вместе взятых. Если с чем-то не согласен, обращайся к ним.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Март 05, 2011, 12:43 »

Так, к слову:
Возможности RTTI на dynamic_cast не заканчиваются)
Есть ещё такая штука, как typeid
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Март 05, 2011, 12:46 »

двух человек, которые в с++ разбираются намного лучше нас с тобой вместе взятых.
Блин, сколько раз тебе говорил - не верь слепо прочитаному. Половина их мыслей неверна (причем незвисимо от того как они шарят - человеку просто надо было написать еще 1 предложение, вот он а бацнул что в голову пришло)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Март 05, 2011, 13:04 »

Ну вот еще один спорщик. Улыбающийся Я не слепо верю, а обдумываю и соглашаюсь или не соглашаюсь.

Закончим офтоп в этой ветке.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Март 05, 2011, 13:36 »

А о чем вы спорите: о термине "понижающее приведение" или о самой сути высказывания? Улыбающийся
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Март 05, 2011, 13:40 »

pastor, о сути, как я понял.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #13 : Март 05, 2011, 13:42 »

Моментик... Я за пивом сбегаю))
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #14 : Март 05, 2011, 13:44 »

Попкорн не забудь.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1] 2 3 ... 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.296 секунд. Запросов: 23.