Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 83
1

Не могу разобраться, static_cast

26.10.2015, 01:15. Просмотров 881. Ответов 6
Метки нет (Все метки)

Доброго времени суток! Столкнулся с непонятным поведением static_cast. Постараюсь описать проблему как можно подробнее, если что- спрашивайте.

Итак, имеются два виджет.

первый виджет (widget1)
widget1.h
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <QWidget>
#include <QLabel>
#include <QHBoxLayout>
 
class widget1 : public QWidget
{
    Q_OBJECT
public:
    widget1(QWidget *parent=0);
 
    double Data123();
private:
    QLabel *lbl;
};


widget1.cpp
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "widget1.h"
 
widget1::widget1(QWidget *parent):QWidget(parent)
{
    lbl=new QLabel("15");
 
    QHBoxLayout *mainLayout=new QHBoxLayout;
    mainLayout->addWidget(lbl);
 
    setLayout(mainLayout);
}
 
double widget1::Data123()
{
    return lbl->text().toDouble();
}


Второй виджет (testWidget)
widget2.h
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <QWidget>
#include <QLabel>
#include <QHBoxLayout>
 
class testWidget : public QWidget
{
    Q_OBJECT
public:
    testWidget(QWidget *parent=0);
 
    double returnData();
private:
    QLabel *label;
};


widget2.cpp
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "widget2.h"
 
testWidget::testWidget(QWidget *parent):QWidget(parent)
{
    label=new QLabel("10");
 
    QHBoxLayout *mainLayout=new QHBoxLayout;
    mainLayout->addWidget(label);
 
    setLayout(mainLayout);
}
 
double testWidget::returnData()
{
    return label->text().toDouble();
}


Также имеется QTabWidget, где собственно и размещены эти 2 виджета в разных вкладках.
tabwidget.h
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "widget1.h"
#include "widget2.h"
#include <QTabWidget>
#include <QDialog>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>
 
 
class MainWidget:public QDialog
{
    Q_OBJECT
public:
    MainWidget(QWidget *parent=0);
 
private:
    QTabWidget *tab;
    QPushButton *btn;
    widget1 *wid1;
    testWidget *testWid;
 
private slots:
    void btnClick();
 
};


tabwidget.cpp
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
MainWidget::MainWidget(QWidget *parent):QDialog(parent)
{
    wid1=new widget1;
    testWid=new testWidget;
 
    tab=new QTabWidget;
 
    btn=new QPushButton(tr("Button"));
 
    tab->addTab(wid1, "WIDGET1");
    tab->addTab(testWid,"TESTWIDGET");
 
    QVBoxLayout *layout=new QVBoxLayout;
    layout->addWidget(tab);
    layout->addWidget(btn);
 
    setLayout(layout);
 
    connect(btn, SIGNAL(clicked()),this,SLOT(btnClick()));
}
 
void MainWidget::btnClick() // самое интересное вот тут
{
    testWidget *ptr=0;  // указатель на второй виджет
 
    double j=0;
 
    for(int i(0); i<tab->count(); i++)
    {
        ptr=static_cast<testWidget*>(tab->widget(i));
        j+=ptr->returnData();       // у первого виджета нету такого метода! ( Data123() )
 
    }
    qDebug()<<j;     // j==25  ?!?!?!
}

Интересует почему j= 25 ( у первого виджета QLabel 15, у второго QLabel 10). Как происходит приведение, ведь эти виджеты даже не знают друг о друге, и методы у них разные, как вообще так ????

Спасибо!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2015, 01:15
Ответы с готовыми решениями:

не могу разобраться
Здравствуйте, у меня такой вопрос. Не могу понять как связать в QT кнопку с...

Не могу с сигналами разобраться!
Почему сигналы editingFinished () с QLineEdit и bool toggled ( bool checked ) с...

Не могу разобраться с Qt + Cmake
Я только начал изучение Qt, использую Clion и Cmake соответственно. Но с cmake...

QSortFilterProxyModel не могу разобраться
Назначил прокси модель. Назначил ей модель. Теперь не могу разобраться как...

Не могу разобраться с qmake
С помощью QtDesigner создал 2 файла gotocelldialog.ui и main.cpp в папке...

6
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
26.10.2015, 01:39 2
Лучший ответ Сообщение было отмечено TheThe как решение

Решение

TheThe, вам поможет dynamic_cast в данном случае
1
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 83
26.10.2015, 01:51  [ТС] 3
Lord Voodoo Спасибо, а Вы не могли бы подсказать, почему так происходит? У меня просто в голове не укладывается. Это же два совершенно разных класса по-сути.
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
26.10.2015, 09:36 4
Лучший ответ Сообщение было отмечено TheThe как решение

Решение

TheThe, кстати, нужно проверять результат приведения, иначе будет краш:

C++
1
2
ptr=dynamic_cast<testWidget*>(tab->widget(i));
if(ptr != 0) j+=ptr->returnData();
а на счет теоретических тонкостей, не подскажу, почитайте мануалы про эти все cast...

static_cast is used for cases where you basically want to reverse an implicit conversion, with a few restrictions and additions. static_cast performs no runtime checks. This should be used if you know that you refer to an object of a specific type, and thus a check would be unnecessary.
dynamic_cast is used for cases where you don't know what the dynamic type of the object is. You cannot use dynamic_cast if you downcast and the argument type is not polymorphic.
1
DrOffset
8130 / 4713 / 1152
Регистрация: 30.01.2014
Сообщений: 7,683
26.10.2015, 17:58 5
Лучший ответ Сообщение было отмечено TheThe как решение

Решение

Цитата Сообщение от TheThe Посмотреть сообщение
почему так происходит?
static_cast - он на то и статик, что дает гарантии только на этапе компиляции. А какие гарантии могут быть на этапе компиляции? Правильно, гарантии типизации. Короче говоря, если типы приводимы (например в одной иерархии наследования), то статик каст осуществляет приведение. Что там в рантайме происходит, и действительно ли приведение даст валидный результат - его не касается, это забота того, кто этот код пишет
1
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 83
26.10.2015, 19:11  [ТС] 6
Спасибо за большое за ответы и разъяснения, только для меня все равно осталось загадкой как он вызвал метод первого виджета( Data123() ) через метод второго виджета ( returnData() ). Ну привел он типы к одному, а как вот метод вызвал, если такого метода даже нету у первого объекта, и даже свойство класса QLabel по-другому названо, а значение все равно как-то получил (15)... Причем посчитал верно.
0
Avazart
Эксперт С++
7722 / 5631 / 549
Регистрация: 10.12.2010
Сообщений: 25,397
Записей в блоге: 17
27.10.2015, 11:43 7
Лучший ответ Сообщение было отмечено TheThe как решение

Решение

Цитата Сообщение от TheThe Посмотреть сообщение
Спасибо за большое за ответы и разъяснения, только для меня все равно осталось загадкой как он вызвал метод первого виджета( Data123() ) через метод второго виджета ( returnData() ).
Насильно, т.е. он тупо считает что там первый виджет, и последствия такого поведения могут самыми быть разными, в лучшем случае приложение падает, в худшем показывает что-то похоже на корректное поведение (до поры до времени)

static_cast можно использовать только когда точно знаешь что аргументом будет именно тот класс к которому приводишь (или если точно знаешь что класс к которому приводишь является базовым)
1
27.10.2015, 11:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2015, 11:43

Не могу разобраться в задании C++ в Qt
Здравствуйте программисты, мне вузе дали задание я не как не могу в нем...

Не могу разобраться с компоновкой QT
Доборого времени суток. Пишу первую программу с использованием QT (и вторую...

Часы - Будильник, не могу разобраться
Взял за основу DigitalClock из примеров по QT и вот что получилось: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru