Klassenobjekt für connect() führt zu Fehler

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Gorion
Beiträge: 12
Registriert: 29. Mai 2009 13:10
Kontaktdaten:

Klassenobjekt für connect() führt zu Fehler

Beitrag von Gorion »

Hi Folks,

sitz hier grad und weiss nimmer weiter....
Ich bekomme folgenden Fehler, wenn ich mein Projekt übersetze:

Code: Alles auswählen

 error: no matching function for call to ¤˜KlingelFeldThread::KlingelFeldThread()'
Mein Ziel ist es einen über einen Socket empfangenen String via Signal/Slot an den Gui Thread zu schicken um ihn da in einem Label anzuzeigen. Ich habe mich dazu der Beispiele Threaded Fortune Server und Blocking Fortune Client bedient und 3 Klassen wie beim Server Example erstellt. Ich setz hier mal den Code der Gui-Klasse und meiner Thread-Klasse rein, die Network-Klasse tut das was sie tun soll :)

Gui-Klassendefinition:

Code: Alles auswählen

#ifndef KLINGELFELD_H
#define KLINGELFELD_H
#include <QString>
#include <QObject>
#include <QTcpServer>
#include "ui_KlingelFeld.h"
#include "KlingelFeldNetworking.h"
#include "klingelfeldthread.h"

class KlingelFeld : public QMainWindow, public Ui::KlingelFeld
{
    Q_OBJECT

public:
    KlingelFeld(QMainWindow *parent = 0);
    ~KlingelFeld();

public slots:
    void newText(const QString &labText);

private:
    Ui::KlingelFeld ui;
    KlingelFeldNetworking Server;
    QString address;
    quint16 port;
    KlingelFeldThread Thread; [color=red]<-- um das gehts[/color]
};

#endif
Gui-Quelldatei:

Code: Alles auswählen

#include <QtGui>
#include <QObject>
#include <QtNetwork>
#include <iostream>
#include <stdlib.h>
#include <QHostAddress>
#include "KlingelFeld.h"
#include "KlingelFeldNetworking.h"
#include "klingelfeldthread.h"
using namespace std;

KlingelFeld::KlingelFeld(QMainWindow *parent)
     : QMainWindow(parent)
{
    setupUi(this);
......

    cout<<"Socket Init"<<endl;
    address = QString::QString("127.0.0.1");
    port = 59001;

    if (!Server.listen(QHostAddress::QHostAddress(address), port)) {
    QMessageBox::critical(this, tr("KlingelFeld Server"),
                                tr("Unable to start the server: %1.")
                                .arg(Server.errorString()));
        close();
        return;
    }
    cout<<"Socket Init Ende, SignalSlot Connects"<<endl;
    connect(&Thread,SIGNAL(getText(QString)),this,SLOT(newText(QString)));[color=red]<--- dieser connect[/color]
    cout<<"Ende Konstruktor Klingelfeld"<<endl;


}

KlingelFeld::~KlingelFeld(){
}

void KlingelFeld::newText(const QString &labText){
    QMessageBox::information(this, tr("KlingelFeld"),
                                 labText);
}
ThreadKlasse - Klassendefinition:

Code: Alles auswählen

#ifndef KLINGELFELDTHREAD_H
#define KLINGELFELDTHREAD_H
//#include "KlingelFeld.h"
#include <QObject>
#include <QThread>
#include <QTcpSocket>
#include <QMutex>
#include <QWaitCondition>

class KlingelFeldThread : public QThread
{
    Q_OBJECT

public:
    KlingelFeldThread(int socketDescriptor, QObject *parent);
    //KlingelFeldThread(QObject *parent);
    ~KlingelFeldThread();
    void run();

signals:
    void error(QTcpSocket::SocketError socketError);
    void getText(const QString &text);[color=red]<--- dieses Signal[/color]

private:
    //KlingelFeld feld;
    int socketDescriptor;
    QMutex mutex;
    QWaitCondition cond;
    bool quit;

};

#endif // KLINGELFELDTHREAD_H
Kann mir hier vielleicht jmnd helfen, ich weiss nicht mehr weiter....

Grüsse Michael
Zuletzt geändert von Gorion am 28. August 2009 14:42, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du erzeugst eine Instanz von KlingelFeldThread in deiner KlingelFeld Klasse aber übergibst nicht die nötigen Parameter socketDescriptor, und parent.

Code: Alles auswählen

KlingelFeldThread(int socketDescriptor, QObject *parent); 
Also entweder keine Instanz als Member sondern einen Pointer oder im ctor von KlingelFeld den member korrekt initialisieren -> c++ basics.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Gorion
Beiträge: 12
Registriert: 29. Mai 2009 13:10
Kontaktdaten:

Beitrag von Gorion »

Bin jetzt hingegangen und hab einen Standardkonstruktor in der Klasse KlingelFeldThread hinzugefügt. Hat funktioniert!

Code: Alles auswählen

header:
KlingelFeldThread();

cpp:
KlingelFeldThread::KlingelFeldThread(){}
Mfg Michael
Danke :)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und wie setzt Du dann den socketDescriptor - member?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Gorion
Beiträge: 12
Registriert: 29. Mai 2009 13:10
Kontaktdaten:

Beitrag von Gorion »

den alten Konstruktor habe ich drin gelassen....

Fehler?

Ansonsten geh ich hin und initialisiere das Objekt mit new Operator

Grüssle Michael
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Das musst du wissen für was socketDescriptor nötig ist...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Gorion
Beiträge: 12
Registriert: 29. Mai 2009 13:10
Kontaktdaten:

Beitrag von Gorion »

socketDeskriptor brauche ich, wenn ich den thread starte :)
Antworten