Russian Qt Forum

Программирование => С/C++ => Тема начата: alexey11111 от Февраль 27, 2012, 15:20



Название: Ошибка: undefined reference
Отправлено: alexey11111 от Февраль 27, 2012, 15:20
Добрый день!
Очень нужна помощь вот по такому вопросу.
В класс Sample зашита статическая callback функция, которая реагирует на сообщения, например от usb устройства (или другого устройства, или какое-либо действие - неважно в данном контексте).  Реакция функции - вывод некоторого текста на QLabel главного окна. Поскольку статические сигналы создавать нельзя, то я это реализовал следующим образом:
- Создал специальный класс Instance (подобие синглтона), унаследованный от QObject
- добавил в класс Instance сигнал setText и метод emitSignal() для отправки сигналов
- добавил в класс Sample член - статическую переменную m_inst типа Instance - указатель на экземпляр Instance.
- m_inst инициализируется как m_inst =  new Instance и соединяется со слотом QLabel
- теперь реакция callback функции может быть реализована в виде m_inst->emitSignal()
Ниже приведен полный код (это демонстрационная вариант, сделал, чтобы суть проблемы передать):

1. instance.h
Код:
#ifndef INSTANCE_H
#define INSTANCE_H

#include <QObject>

/*Класс Instance используется как синглтон
для рассылки сигналов  из static callback функции класса Sample*/
class Instance : public QObject
{
    Q_OBJECT

public:
    explicit Instance(QObject *parent = 0);
    ~Instance();

//Метод для рассылки сигналов из static callback функции класса Sample
    void emitSignal(QString str);

signals:
    void setText(QString);
};

#endif // INSTANCE_H

2. Instance.cpp
Код:
#include "instance.h"

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

Instance::~Instance()
{
}

void Instance::emitSignal(QString str)
{
    emit setText(str);
}

3. sample.h
Код:
#ifndef SAMPLE_H
#define SAMPLE_H

#include <QMainWindow>
#include "instance.h"

namespace Ui {
    class Sample;
}

class Sample : public QMainWindow
{
    Q_OBJECT

public:
    explicit Sample(QWidget *parent = 0);
    ~Sample();

    //Статический (и единственный) экземпляр вспомогательного класса Instance
    static Instance *m_inst;

    //Статическая Callback-функция, отправляющая сигналы в Label
    static void callback();

private slots:
    //Кнопка для генерации событий для callback
    void on_pushButton_clicked();

private:
    Ui::Sample *ui;
};

#endif // SAMPLE_H

4. sample.cpp
Код:
#include "sample.h"
#include "ui_sample.h"


Sample::Sample(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Sample)
{
    ui->setupUi(this);

    //Инициализируем синглтон и соединяем его с главным окном
    m_inst = new Instance;
    QObject::connect(m_inst, SIGNAL(setText(QString)), ui->label, SLOT(setText(QString)));
}

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

void Sample::callback()
{
    Sample::m_inst->emitSignal("Texxxt");
}



void Sample::on_pushButton_clicked()
{
    Sample::callback();
}

5. main.cpp
Код:
#include <QtGui/QApplication>
#include "sample.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Sample w;
    w.show();

    return a.exec();
}

6. .pro файл
Код:
QT       += core gui

TARGET = untitled4
TEMPLATE = app


SOURCES += main.cpp\
        sample.cpp \
        instance.cpp

HEADERS  += sample.h \
            instance.h

FORMS    += sample.ui

Проект не компилируется. Выводится 6 раз такая штука "ошибка: undefined reference to `Sample::m_inst'"
В чем проблема?

Заранее благодарю за помощь.


Название: Re: Ошибка: undefined reference
Отправлено: Alex Custov от Февраль 27, 2012, 15:28
статический атрибут класса нужно явным образом создать

sample.cpp
Код:
#include "sample.h"
#include "ui_sample.h"

Instance * Sample::m_inst = 0; // <==

Sample::Sample(QWidget *parent) :
...


Название: Re: Ошибка: undefined reference
Отправлено: alexey11111 от Февраль 27, 2012, 22:14
Спасибо огромное!!!!!!!!!!!! Все заработало!!!!!!!!