crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3  
Ответить в данную темуНачать новую тему
> Ошибка invalid conversion from `QWidget*' to `QComboBox*'
kwisp
  опции профиля:
сообщение 16.9.2010, 22:00
Сообщение #21


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Алексей1153 @ 16.9.2010, 22:49) *
это не пример. Во первых, АДРЕС не поменяется от этого. Во вторых, для таких случаев должен быть виртуальный деструктор, либо ты уж учитывай, какой тип удаляется и приведи его перед удалением

адресс не поменяется, поменяется "значение указателя" ведь он тем или иным способом хранит информацию о ТИПЕ!
при приведении типов старым способом компилер должен переберать сначала static_cast если не уместно то reinterpret_cast потом может взять dynamic_cast.
чаще всего берется reinterpret_cast не проверяются типы и т.д. т т.п.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 16.9.2010, 22:06
Сообщение #22


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Алексей1153 @ 16.9.2010, 22:50) *
я вредное, я знаю... Но пока не увидел убедительных объяснений обязаловки применения каста :)

Давай смотреть. :)
#include <iostream>

class A
{
    int val1;
};

class B
{
    int val2;
};

class C : public A, public B
{
    int val3;
};

int main()
{
    // Создали объект класса B (он содержит одну(!) переменную типа int)
    B bObj;

    // Спокойно преобразовали ее к типу C, который должен содержать три(!) переменных типа int.
    // Давай попробуем записать и переменные var2 и var3, для которых память не выделялась.
    C *c1 = (C*)&bObj;
    std::cout << (void *)c1 << std::endl;

    // Попробуем тоже с кастом. На этапе компиляции нам скажут, что мы не правы.
    C *c2 = dynamic_cast<C*>( &bObj );
    std::cout << (void *)c2 << std::endl;

    return 0;
}

Сишное преобразование ничего не контролирует, с его помошью я могу преобразовать QString к QWidget, последствия правда будут не хорошие.

Насчет корректировки адреса указателя.
Попробуй с теми же классами выполнить следующие преобразования:
    C c;
    std::cout << (void *)&c << std::endl;
    
    A *a = dynamic_cast<A*>( &c );
    std::cout << (void *)a << std::endl;

    B *b = dynamic_cast<B*>( &c );
    std::cout << (void *)b << std::endl;

И посмотри как будет меняться указатель.
Кстати сишные преобразования тоже так умеют. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 16.9.2010, 22:10
Сообщение #23


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(BRE @ 16.9.2010, 23:06) *
Сишное преобразование ничего не контролирует, с его помошью я могу преобразовать QString к QWidget, последствия правда будут не хорошие.

в принципе всё контролирует кроме dynamic_cast
Цитата
5.4
Explicit type conversion (cast notation)
[expr.cast]
1 The result of the expression (T) cast-expression is of type T. The result is an lvalue if T is an lvalue reference
type or an rvalue reference to function type and an xvalue if T is an rvalue reference to object type; otherwise
the result is a prvalue. [ Note: if T is a non-class type that is cv-qualified, the cv-qualifiers are ignored when
determining the type of the resulting prvalue; see 3.10. — end note ]
2 An explicit type conversion can be expressed using functional notation (5.2.3), a type conversion operator
(dynamic_cast, static_cast, reinterpret_cast, const_cast), or the cast notation.
cast-expression:
unary-expression
( type-id ) cast-expression
3 Any type conversion not mentioned below and not explicitly defined by the user (12.3) is ill-formed.
4 The conversions performed by
— a const_cast (5.2.11),
— a static_cast (5.2.9),
— a static_cast followed by a const_cast,
— a reinterpret_cast (5.2.10), or
— a reinterpret_cast followed by a const_cast,

поэтому возможно придумать некоторый пример с полиморфными классами где будет применён reinterpret_cast.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 16.9.2010, 22:11
Сообщение #24


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Алексей1153 @ 16.9.2010, 22:50) *
Но пока не увидел убедительных объяснений обязаловки применения каста

тфу.
ты наверное прикалываешься - открой страуструпа (или любой другой весомый материал) стандарт в конце концов и почитай!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 16.9.2010, 22:17
Сообщение #25


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(DEADHUNT @ 16.9.2010, 23:10) *
в принципе всё контролирует кроме dynamic_cast

Мы говорим про указатели, ты хочешь сказать, что мне компилятор не даст так сделать?
    QString str;
    QWidget *w = (QWidget*)&str;

Проверь сам.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 16.9.2010, 22:27
Сообщение #26


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(BRE @ 16.9.2010, 23:17) *
Мы говорим про указатели, ты хочешь сказать, что мне компилятор не даст так сделать?

я такого не говорил, в данном случае компилятор применит reinterpret_cast(как описано выше), имелось ввиду что когда будет возможно применить безопасное преобразование, компилятор его применит(только в тех случаях которые описаны в стандарте)

Сообщение отредактировал DEADHUNT - 16.9.2010, 22:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.9.2010, 22:28
Сообщение #27


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


BRE, ну ты каких-то далёких от реальной жизни извращений набацал )) В которых принято специальные методы в классах делать, в коих вся темнота должна вручную разбираться, без всяких кастов. Я про это и говорю как раз

Цитата
Спокойно преобразовали ее к типу C,

указатель от родителя к дитю нельзя спокойно приводить, надо при этом сильно волноваться и думать :)

Цитата(kwisp @ 17.9.2010, 1:11) *
открой страуструпа (или любой другой весомый материал) стандарт в конце концов и почитай!

не, не аргумент. Мясо давай, мясо ))

Сообщение отредактировал Алексей1153 - 16.9.2010, 22:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 16.9.2010, 22:31
Сообщение #28


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Алексей1153 @ 16.9.2010, 23:28) *
не, не аргумент. Мясо давай, мясо ))

колиника доктора Верховцева по тебе плачет. )
убеждать людей в очевидных вещах - глупая затея. потому что убеждать не надо они ОЧЕВИДНЫЕ.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 16.9.2010, 22:33
Сообщение #29


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Алексей1153 @ 16.9.2010, 23:28) *
указатель от родителя к дитю нельзя спокойно приводить, надо при этом сильно волноваться и думать :)

Вот-вот, поэтому лучше сразу подружиться с кастами и пользоваться ими. Тогда компилятор будет сильно помогать не допустить ошибку при преобразовании.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.9.2010, 22:38
Сообщение #30


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


BRE, я такие ошибки не допускаю )

Цитата(kwisp @ 17.9.2010, 1:31) *
убеждать людей в очевидных вещах - глупая затея. потому что убеждать не надо они ОЧЕВИДНЫЕ.

это ты точно заметил )) Поэтому я тебя и не убеждаю.

Вообще, сильно отклонились от причины моего возмущения - а причина была такова, что, раз уж известно, что там у него должен лежать QComboBox* , то приводить (QComboBox*)(QWidget*) можно без всяких кастов.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 10:57