Russian Qt Forum

Qt => Вопросы новичков => Тема начата: arz.maslov от Сентябрь 26, 2012, 11:07



Название: Помогите побороть непонятную ошибку!
Отправлено: arz.maslov от Сентябрь 26, 2012, 11:07
Все доброе время суток. На QT пишу совсем не долго.

При компиляции вываливается ошибка:
D:\workspace\Tests-build-desktop-Qt_4_8_2__4_8_2_________\Gateway\..\..\Tests\Gateway\gateway.cpp:41: ошибка: 'QObject' is an ambiguous base of 'GatewayUdp'

Код:
gateway.h
Код:
#ifndef GATEWAY_H
#define GATEWAY_H

#include <QObject>
#include <QThread>
#include <QList>
#include <QtNetwork/QUdpSocket>
#include <QtNetwork/QHostAddress>

////////////////////////////////////////////////////////////////////////

class Gateway : public QObject, public QThread
{
    Q_OBJECT
public:
    explicit Gateway(QObject *parent = 0);
   
    virtual void addRecipient(Gateway*)=0;

signals:
   
public slots:
    virtual void readMessage()=0;
    virtual void sendMessage(QByteArray*)=0;

protected:
    QList<Gateway> listRecipients;
};

////////////////////////////////////////////////////////////////////////

class GatewayUdp : public QObject,public Gateway
{
    Q_OBJECT
public:
    GatewayUdp(QString,int,int,QObject *parent=0);
    void addRecipient(Gateway*);
    void run();
public slots:
    void readMessage();
    void sandMessage(QByteArray*);
    //void setData(QString,int,int);

private:
    QUdpSocket *udpSocket;
    QHostAddress fromAdr;   //Адрес отправителя
    quint16 fromPort;       //Порт отправителя. Порт который слушаем.
    quint16 inPort;         //Порт по которому отправляем сообщения.
};
#endif // GATEWAY_H

gateway.cpp
Код:
#include "gateway.h"

Gateway::Gateway(QObject *parent) :
    QObject(parent)
{
}
/////////////////////////////////////////////////////////////////////////////////////////////////
GatewayUdp::GatewayUdp(QString fromAdr, int fromPort, int inPort,QObject *parent): Gateway(parent)
{
    this->fromAdr = QHostAddress(fromAdr);
    this->fromPort = fromPort;
    this->inPort = inPort;
    run();
}

void GatewayUdp::addRecipient(Gateway *recipient)
{
    listRecipients.append(*recipient);
}

void GatewayUdp::readMessage(){
    QByteArray data;

    while(udpSocket->hasPendingDatagrams()){
        data.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(data.data(),data.size(),&fromAdr,&fromPort);
    }

    qDebug("GatewayUDP::readMessage()   :   date = ",data.data());
}

void GatewayUdp::sandMessage(QByteArray *data)
{
    udpSocket->writeDatagram(*data,this->fromAdr,this->inPort);
}


void GatewayUdp::run(){
    udpSocket = new QUdpSocket();
    udpSocket->bind(this->fromAdr,this->fromPort);
    QObject::connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readMessage()));
}

Помогите необразованному)))


Название: Re: Помогите побороть непонятную ошибку!
Отправлено: mutineer от Сентябрь 26, 2012, 11:10
Зачем ты каждый класс явно наследуешь от QObject? QThread уже является наследником от QObject, убери множественное наследование

К тому же явно вызывать run() у наследника потока не надо - в этом случае не будет новый поток создаваться. Используй start()


Название: Re: Помогите побороть непонятную ошибку!
Отправлено: arz.maslov от Сентябрь 26, 2012, 11:17
Ага, спасибо)) С множественным наследованием разобрались, но теперь вот такая проблема:))

c:\Programs\Qt\4.8.2\include\QtCore\..\..\src\corelib\tools\qlist.h:372: ошибка: cannot allocate an object of abstract type 'Gateway'


Название: Re: Помогите побороть непонятную ошибку!
Отправлено: mutineer от Сентябрь 26, 2012, 11:19
Gateway - абстрактный класс, потому что в нем есть нереализованные функции. Объекты абстрактного класса нельзя создавать, соответственно нельзя хранить по значению в контейнерах

QList<Gateway> listRecipients; - вот из-за этого ошибка. Используй указатели, Люк


Название: Re: Помогите побороть непонятную ошибку!
Отправлено: arz.maslov от Сентябрь 26, 2012, 11:26
Поправил, вроде бы все в порядке. но вывавивается теперь следующее

D:\workspace\Tests-build-desktop-Qt_4_8_2__4_8_2_________\Gateway\..\..\Tests\Gateway\gateway.cpp:10: ошибка: undefined reference to `_imp___ZN12QHostAddressC1Ev'
D:\workspace\Tests-build-desktop-Qt_4_8_2__4_8_2_________\Gateway\..\..\Tests\Gateway\gateway.cpp:12: ошибка: undefined reference to `_imp___ZN12QHostAddressC1ERK7QString'
D:\workspace\Tests-build-desktop-Qt_4_8_2__4_8_2_________\Gateway\..\..\Tests\Gateway\gateway.cpp:12: ошибка: undefined reference to `_imp___ZN12QHostAddressaSERKS_'
...
и т.д. штук 20.

Не понятно с чем это связано(((


Название: Re: Помогите побороть непонятную ошибку!
Отправлено: mutineer от Сентябрь 26, 2012, 11:27
Очевидно с изменениями в коде, которых я не вижу. Или с неподключенной в .pro библиотекой


Название: Re: Помогите побороть непонятную ошибку!
Отправлено: GreatSnake от Сентябрь 26, 2012, 11:28
QT += network


Название: Re: Помогите побороть непонятную ошибку!
Отправлено: arz.maslov от Сентябрь 26, 2012, 11:34
Большое спасибо всем)

последняя ошибка:
:-1: ошибка: collect2: ld returned 1 exit status

с чем это может быть связано?
main самый примитивный и простой

main.cpp

Код:
#include <QApplication>

int main(int c, char** v)
{
    QApplication *app = new QApplication(c,v);

    return app->exec();
}



Название: Re: Помогите побороть непонятную ошибку!
Отправлено: LisandreL от Сентябрь 26, 2012, 11:45
Сделайте полную пересборку, если ошибка не исчезнет, то показывайте текст из консоли сборки показывайте.


Название: Re: Помогите побороть непонятную ошибку!
Отправлено: mutineer от Сентябрь 26, 2012, 11:45
выше в выводе компиляции обычно подробности ошибки рассказаны


Название: Re: Помогите побороть непонятную ошибку!
Отправлено: arz.maslov от Сентябрь 26, 2012, 12:03
Ошибка нашлась)))


Название: Re: Помогите побороть непонятную ошибку!
Отправлено: Пантер от Сентябрь 26, 2012, 12:11
Ошибка нашлась)))

Дык озвучь. А то вдруг у кого-то еще будет такая ошибка.


Название: Re: Помогите побороть непонятную ошибку!
Отправлено: arz.maslov от Сентябрь 26, 2012, 12:27
В объявлении класса Wateway метод addRecipient(Gateway*) забыл добавить "=0".