[gelöst] Statische Klassenfunktion wird nicht gefunden

Alles rund um die Programmierung mit Qt
shs
Beiträge: 24
Registriert: 13. Juli 2005 20:53
Wohnort: Köln

[gelöst] Statische Klassenfunktion wird nicht gefunden

Beitrag von shs »

Hallo,

ich habe folgende Deklaration:

Code: Alles auswählen

#ifndef HELPBROWSER_H
#define HELPBROWSER_H

class QAssistantClient;

class HelpBrowser
{
public:
    static void showHelpPage(const QString &page);
private:
    static QAssistantClient *assistant;
};

#endif
Und diese Implementation:

Code: Alles auswählen

#include <qassistantclient.h>

#include "helpbrowser.h"

QAssistantClient *HelpBrowser::assistant = 0;

void HelpBrowser::showHelpPage(const QString &page)
{
    if(!assistant)
	assistant = new QAssistantClient("");
    assistant->showPage(page);
}
In einem Hauptfenster habe ich im header class HelpBrowser; vorweg deklariert, damit die Klasse bekannt ist und in der Implementation des Hauptfensters habe ich mit #include "helpbrowser.h" den header eingebunden.

Wenn ich jetzt versuche mit:

Code: Alles auswählen

  QString page = "help.html";
    HelpBrowser::showHelpPage(page);
die statische Klassenfunktion aufzurufen, erhalte ich beim Kompilieren den Fehler:

Code: Alles auswählen

mainwindow.h: error: class HelpBrowser has no member named showHelpPage
Ist das nicht korrekt, die statische Funktion so aufzurufen?
Zuletzt geändert von shs am 25. Juli 2005 15:39, insgesamt 1-mal geändert.
shs
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Von der Sache her passt das schon, was du machst.
Mit welchem Compiler arbeitest denn?

Goos
shs
Beiträge: 24
Registriert: 13. Juli 2005 20:53
Wohnort: Köln

Compiler

Beitrag von shs »

Hallo,

ich arbeite mit dem GCC 3.3.1 unter SuSE Linux 9.0.
shs
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Re: Statische Klassenfunktion wird nicht gefunden

Beitrag von Goos »

shs hat geschrieben: In einem Hauptfenster habe ich im header class HelpBrowser; vorweg deklariert, damit die Klasse bekannt ist
Wieso genau hast das gemacht?

Ich wuerde fast schaetzen, dass du irgendwo Probleme mit der Reihenfolge von Includefiles hast.

Goos
shs
Beiträge: 24
Registriert: 13. Juli 2005 20:53
Wohnort: Köln

Reihenfolge der Include-Files

Beitrag von shs »

Korrigiere mich, wenn ich falsch liege:

Ich habe aus dem Qt-Buch "C++ GUI Programming with Qt 3" gelernt, dass die Kompilation beschleunigt wird, wenn statt der Einbindung des headers in eine Deklaration die Klasse als Forward-Deklaration eingeführt wird.

Also mache ich in der mainwindow.h die Forward-Deklaration:

Code: Alles auswählen

class HelpBrowser;

class MainWindow : public QDialog
{
   ...
};
Und binde in der Implementation mainwindow.cpp den Header ein:

Code: Alles auswählen

#include "helpbrowser.h"
shs
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Reihenfolge der Include-Files

Beitrag von Christian81 »

shs hat geschrieben: Also mache ich in der mainwindow.h die Forward-Deklaration:
Und wie soll er dann in der mainwindow.h wissen welche Funktionen die Klasse HelpBrowser bereitstellt?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Re: Reihenfolge der Include-Files

Beitrag von Goos »

Christian81 hat geschrieben:und wie soll er dann in der mainwindow.h wissen welche Funktionen die Klasse HelpBrowser bereitstellt?
Muss er ja vielleicht gar nicht, wenn keine HelpBrowser Objekte deklariert werden.

Goos
shs
Beiträge: 24
Registriert: 13. Juli 2005 20:53
Wohnort: Köln

Re: Reihenfolge der Include-Files

Beitrag von shs »

Christian81 hat geschrieben:Und wie soll er dann in der mainwindow.h wissen welche Funktionen die Klasse HelpBrowser bereitstellt?
Nun ja, ich habe mir das so vorgestellt: In der mainwindow.h wird der Compiler von der Existenz einer Klasse in Kenntnis gesetzt.

Erst in der Implementation wird die statische Klassenfunktion

Code: Alles auswählen

static void showHelpPage(const QString &page); 
aufgerufen.

Und da der header "helpbrowser.h" in der Implementation eingebunden ist, müsste der Compiler die Funktion doch kennen, oder?
shs
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Muesste ist richtig, ja :)
Musst vielleicht noch n bissl Code aus deiner mainwindow.h und mainwindow.cpp posten und dazu noch erzaehlen, was du dort sonst noch so alles includierst.

Goos
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Da der Compiler dies bemängelt:

Code: Alles auswählen

mainwindow.h: error: class HelpBrowser has no member named showHelpPage
Gehe ich einfach mal davon aus, dass Du in der mainwindow.h die Funktion showHelpPage() aufrufst und deshalb mein obiges Posting zutrifft.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag von Goos »

Ok, jetzt wo ich doch nochmal mal die Fehlermeldung angeschaut hab schliess ich mich Christian81 an :)
Wieso definierst die entsprechende Funktion nicht einfach in deiner mainwindow.cpp?

Goos
shs
Beiträge: 24
Registriert: 13. Juli 2005 20:53
Wohnort: Köln

Projekt

Beitrag von shs »

Alles klar, das wars!

Dann muss ich eben den header in beide Dateien einbinden!
shs
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Deine pro-Datei ist nicht korrekt. Rufe nochmal 'qmake -project' auf damit auch helpbrowser.cpp mit eingebunden wird.
Dann solltest du noch 'LIBS +=-lqassistantclient' in der pro-Datei hinzufügen und mit 'qmake' dein Makefile neu erstellen.

Mhhh wo ist jetzt dein Beitrag mit dem Sourcecode hin? Naja wenns jetzt geht ists gut :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
shs
Beiträge: 24
Registriert: 13. Juli 2005 20:53
Wohnort: Köln

Beitrag von shs »

Danke euch!

Ich habe auch bemerkt, dass ich die *.pro nicht aktualisiert habe. Daher habe ich den Eintrag aktualisiert.
shs
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Re: Projekt

Beitrag von Goos »

shs hat geschrieben:Alles klar, das wars!

Dann muss ich eben den header in beide Dateien einbinden!
Ne, das reicht dann ansich schon in der Headerdatei deiner mainwindow Klasse.
Wenn Du sie trotzdem in Header und CPP File einbindest, dann macht das aber auch nix, da du ja die Preprocessor Direktive #ifndef einsetzt.

Goos
Antworten