crossplatform.ru

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


  Ответ в Ошибка invalid conversion from `QWidget*' to `QComboBox*'
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Алексей1153 Дата 16.9.2010, 22:38
  BRE, я такие ошибки не допускаю )

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

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

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

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

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

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

колиника доктора Верховцева по тебе плачет. )
убеждать людей в очевидных вещах - глупая затея. потому что убеждать не надо они ОЧЕВИДНЫЕ.
Алексей1153 Дата 16.9.2010, 22:28
  BRE, ну ты каких-то далёких от реальной жизни извращений набацал )) В которых принято специальные методы в классах делать, в коих вся темнота должна вручную разбираться, без всяких кастов. Я про это и говорю как раз

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

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

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

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

я такого не говорил, в данном случае компилятор применит reinterpret_cast(как описано выше), имелось ввиду что когда будет возможно применить безопасное преобразование, компилятор его применит(только в тех случаях которые описаны в стандарте)
BRE Дата 16.9.2010, 22:17
 
Цитата(DEADHUNT @ 16.9.2010, 23:10) *
в принципе всё контролирует кроме dynamic_cast

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

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

тфу.
ты наверное прикалываешься - открой страуструпа (или любой другой весомый материал) стандарт в конце концов и почитай!
DEADHUNT Дата 16.9.2010, 22:10
 
Цитата(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.
BRE Дата 16.9.2010, 22:06
 
Цитата(Алексей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;

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

адресс не поменяется, поменяется "значение указателя" ведь он тем или иным способом хранит информацию о ТИПЕ!
при приведении типов старым способом компилер должен переберать сначала static_cast если не уместно то reinterpret_cast потом может взять dynamic_cast.
чаще всего берется reinterpret_cast не проверяются типы и т.д. т т.п.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 21:33