LINUX.ORG.RU

Баг в QObject::connect?

 ,


0

8

Суть такова:

1. Создается класс Test с сигналом и слотом.
2. Создается форма, допустим с кнопкой.
3. В классе формы объявляется поле Test* test
4. Инициализируете его в конструкторе формы нулем.
5. В том же конструкторе создается локальную переменную того же типа и с тем же именем, после чего делается к ней connect

Приложение упадет с сегфолтом.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

В том же конструкторе создается локальную переменную того же типа и с тем же именем, после чего делается к ней connect

Что к чему коннектится?

Инкрементирую реквест KblCb

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)

Я правильно понял, что вы рекурсивно в конструкторе создаёте экземпляр такого же класса?

Dendy ★★★★★
()

Приложение упадет с сегфолтом.

скорее всего ты NULL пытался разименовать. Код показывай, телепаты в отпуске.

drBatty ★★
()
Ответ на: комментарий от Dendy

Нет, создается (дважды) экземпляр другого класса, причем один из них - локальный. Типа Test *test = new Test(); Незадолго до этого, делается test(0), после чего делаем QObject::connect(test, SIGNAL(ttest()), this, SLOT(button_clicked());

LongLiveUbuntu ★★★★★
() автор топика

Подписался на тред.
Жду, когда тут появится рабочий падающий код.

trex6 ★★★★★
()

Код в студию! Ну или хотя-бы бэктрейс для начала.

Kosyak ★★★★
()

В том же конструкторе создается локальную переменную того же типа и с тем же именем, после чего делается к ней connect

Я ничё не понял. В конструкторе создается еще один Test* test и к нему connect?

no-such-file ★★★★★
()

Так у тебя стек наверно переполняется, не?

unC0Rr ★★★★★
()

Да, баг. Ты тут совершенно ни при чем.

anonymous
()

для начала код, но... <ванга mode> коннект к локальным экземплярам классов в стеке = 100% сегфолт по очевидным причинам </ванга mode>

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от MikeDM

Я бы не был так категоричен, можно еще к Q_INVOKABLE и другому сигналу.

bjorn
()
Ответ на: комментарий от unfo

Если разные имена локальной переменной и поля? Не пробовал.

LongLiveUbuntu ★★★★★
() автор топика

Приложение упадет с сегфолтом.

Java программисты не умеют пользоваться GDB?

bhfq ★★★★★
()
Ответ на: комментарий от x0r

Foo.h

#ifndef FOO_H
#define FOO_H

#include <QObject>

class Foo : public QObject
{
    Q_OBJECT
public:
    explicit Foo(QObject *parent = 0);
    
signals:
    void ttest(const QString&);
    
public slots:
    void test();
};

#endif // FOO_H

Foo.cpp

#include "Foo.h"
#include <QDebug>

Foo::Foo(QObject *parent) :
    QObject(parent)
{
}

void Foo::test()
{
    emit ttest("Bar");
}

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от x0r

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}
class Foo;

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    
private:
    Ui::MainWindow *ui;
    Foo* tester;
private slots:
    void baz(const QString& data);
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include "Foo.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//,
    //tester(0)
{
    ui->setupUi(this);
    Foo *tester = new Foo();
    connect(tester, SIGNAL(ttest(QString)), this, SLOT(baz(QString)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::baz(const QString &data) {
    qDebug() << data;
}

void MainWindow::on_pushButton_clicked()
{
    tester->test();
}

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от x0r

main.cpp

#include <QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    
    return a.exec();
}

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от LongLiveUbuntu
void MainWindow::on_pushButton_clicked()
{
    tester->test();
}

Указатель tester указывает хрен знает куда.

anonymous
()
Ответ на: комментарий от Chaser_Andrey

Я правильно понимаю, что повторно объявляется один и тот же указатель? Лень с телефона вчитываться)

nand
()
Ответ на: комментарий от nand

А пардон, увидел конструктор.Вопросов не имею.

nand
()
Ответ на: комментарий от LongLiveUbuntu

При создании указатель на родителя не забыл передать?

nand
()

Блин не читатель я по ходу, все бред. Пойду с компа почитаю.

nand
()
Ответ на: комментарий от schizoid

ТС запутал с названиями объектов совсем. Я и не заметил подвоха, что один из объектов локальный, а другой с указателем черт пойми куда. Сначала показалось, что в h объявленный он и инициализирует в конструкторе окна.

nand
()
Ответ на: комментарий от LongLiveUbuntu

tester(0) - это инициализация указателя нулём, а не создание. Создание должно выглядеть здесь как tester(new Foo(this)).

schizoid ★★★
()
Ответ на: комментарий от nand

Вот поэтому я юзаю префикс «m_» для мемберов класса вида m_MemberName.

Олсо, посылаю лучики ненависти дизайнерам за ёлочку

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

локальная переменная «Foo *tester = new Foo();» объявленная в MainWindow::MainWindow() перекрывает частное свойство класса «private: Foo* tester;». В итоге инициируется локальная переменная tester - ссылкой на объект Foo, а свойство класса MainWindow::tester продолжает указывать в пустоту. В итоге в методе MainWindow::on_pushButton_clicked() при обращении tester->test(); вызывается «пустота».

предлагаю автору самому догадаться как изменить код.

Denjs
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.