Seite 1 von 2
[gelöst] Statische Klassenfunktion wird nicht gefunden
Verfasst: 23. Juli 2005 13:15
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?
Verfasst: 25. Juli 2005 11:35
von Goos
Von der Sache her passt das schon, was du machst.
Mit welchem Compiler arbeitest denn?
Goos
Compiler
Verfasst: 25. Juli 2005 12:15
von shs
Hallo,
ich arbeite mit dem GCC 3.3.1 unter SuSE Linux 9.0.
Re: Statische Klassenfunktion wird nicht gefunden
Verfasst: 25. Juli 2005 13:10
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
Reihenfolge der Include-Files
Verfasst: 25. Juli 2005 13:29
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:
Re: Reihenfolge der Include-Files
Verfasst: 25. Juli 2005 13:34
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?
Re: Reihenfolge der Include-Files
Verfasst: 25. Juli 2005 13:49
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
Re: Reihenfolge der Include-Files
Verfasst: 25. Juli 2005 13:50
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
aufgerufen.
Und da der header "helpbrowser.h" in der Implementation eingebunden ist, müsste der Compiler die Funktion doch kennen, oder?
Verfasst: 25. Juli 2005 13:58
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
Verfasst: 25. Juli 2005 14:06
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.
Verfasst: 25. Juli 2005 14:13
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
Projekt
Verfasst: 25. Juli 2005 15:25
von shs
Alles klar, das wars!
Dann muss ich eben den header in beide Dateien einbinden!
Verfasst: 25. Juli 2005 15:38
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

Verfasst: 25. Juli 2005 15:45
von shs
Danke euch!
Ich habe auch bemerkt, dass ich die *.pro nicht aktualisiert habe. Daher habe ich den Eintrag aktualisiert.
Re: Projekt
Verfasst: 25. Juli 2005 15:49
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