Russian Qt Forum
Ноябрь 23, 2024, 11:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите побороть непонятную ошибку!  (Прочитано 6303 раз)
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()));
}

Помогите необразованному)))
Записан
mutineer
Гость
« Ответ #1 : Сентябрь 26, 2012, 11:10 »

Зачем ты каждый класс явно наследуешь от QObject? QThread уже является наследником от QObject, убери множественное наследование

К тому же явно вызывать run() у наследника потока не надо - в этом случае не будет новый поток создаваться. Используй start()
« Последнее редактирование: Сентябрь 26, 2012, 11:13 от mutineer » Записан
arz.maslov
Гость
« Ответ #2 : Сентябрь 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'
Записан
mutineer
Гость
« Ответ #3 : Сентябрь 26, 2012, 11:19 »

Gateway - абстрактный класс, потому что в нем есть нереализованные функции. Объекты абстрактного класса нельзя создавать, соответственно нельзя хранить по значению в контейнерах

QList<Gateway> listRecipients; - вот из-за этого ошибка. Используй указатели, Люк
Записан
arz.maslov
Гость
« Ответ #4 : Сентябрь 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.

Не понятно с чем это связано(((
Записан
mutineer
Гость
« Ответ #5 : Сентябрь 26, 2012, 11:27 »

Очевидно с изменениями в коде, которых я не вижу. Или с неподключенной в .pro библиотекой
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Сентябрь 26, 2012, 11:28 »

QT += network
Записан

Qt 5.11/4.8.7 (X11/Win)
arz.maslov
Гость
« Ответ #7 : Сентябрь 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();
}

Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #8 : Сентябрь 26, 2012, 11:45 »

Сделайте полную пересборку, если ошибка не исчезнет, то показывайте текст из консоли сборки показывайте.
Записан
mutineer
Гость
« Ответ #9 : Сентябрь 26, 2012, 11:45 »

выше в выводе компиляции обычно подробности ошибки рассказаны
Записан
arz.maslov
Гость
« Ответ #10 : Сентябрь 26, 2012, 12:03 »

Ошибка нашлась)))
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Сентябрь 26, 2012, 12:11 »

Ошибка нашлась)))

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
arz.maslov
Гость
« Ответ #12 : Сентябрь 26, 2012, 12:27 »

В объявлении класса Wateway метод addRecipient(Gateway*) забыл добавить "=0".
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.