Seite 1 von 1
Unterschied zwischen Header-Datei und "class"
Verfasst: 12. April 2006 15:08
von oberschlingel
Eine (vermutlich sehr doofe) Frage:
Was ist der Unterschied, wenn ich in meiner Header-Datei #include <QButton> schreibe, oder class QButton; ?
Danke!
Verfasst: 12. April 2006 15:41
von FlorianBecker
Mit class QButton wird die Definition nur weitergereicht und muss dann wo anderes included werden.
Es wird verwendet um Abhängigkeiten zu vermeiden.
Verfasst: 12. April 2006 15:46
von Goos
FlorianBecker hat geschrieben:
Es wird verwendet um Abhängigkeiten zu vermeiden.
Wie meinst das genau?
Goos
PS: ach und Vorwärtsdeklaration nennt man das ganze
Verfasst: 12. April 2006 15:51
von FlorianBecker
Beispiel, eine Header Datei wird öfters included, dann brauchst du jedes Mal die Abhängigkeit der Header in jeder der Dateien. D.H. der Compiler ließt die Datei und kopiert diese in das Objekt. Wenn du den Header nicht includest, wird Sie auch nicht hin einkopiert. Gut, es ist durchaus noch ein wenig komplexer, aber für eine allgemeine Beurteilung sollte der Satz genügen.
Die Vorwärtsdeklaration funktioniert nur mit Pointern. Bei Referenzen kann man diese nicht verwenden.
Verfasst: 12. April 2006 16:01
von Goos
FlorianBecker hat geschrieben:Beispiel, eine Header Datei wird öfters included, dann brauchst du jedes Mal die Abhängigkeit der Header in jeder der Dateien. D.H. der Compiler ließt die Datei und kopiert diese in das Objekt. Wenn du den Header nicht includest, wird Sie auch nicht hin einkopiert. Gut, es ist durchaus noch ein wenig komplexer, aber für eine allgemeine Beurteilung sollte der Satz genügen.
Ach so hast das gemeint. Ok, wo siehst du dabei einen Vorteil?
FlorianBecker hat geschrieben:
Die Vorwärtsdeklaration funktioniert nur mit Pointern. Bei Referenzen kann man diese nicht verwenden.
Was hat unser "class QButton" aus dem Beispiel hier bitte mit Pointern, oder Referenzen zutun?
...oder anders gesagt, erklaer bitte mal, was du unter Vorwaertsdeklaration verstehst.
Goos
Verfasst: 12. April 2006 17:58
von FlorianBecker
Also eigentlich weiß ich nicht, ob du aus Langeweile fragst, oder es wirklich nicht weißt.
Der Vorteil besteht darin, dass du diese Header nicht in den Objekten hältst, damit auf unterschiedlichen Compilern Zeit und Platz sparst.
Was das mit Pointer und Referenzen zu tun hat?
QButton *btnEins;
hier kannst du class QButton verwenden
QButton btnEins;
hier musst du den Header verwenden.
Verfasst: 12. April 2006 18:12
von oberschlingel
Darf ich dann nochmal dumm fragen:
Wann verwende ich
und wann
?
Verfasst: 12. April 2006 18:16
von FlorianBecker
Das war nur ein Beispiel, du solltest QButton nur als QButton *btnEins benutzen. Es ging nur um die Veranschaulichung.
Verfasst: 12. April 2006 19:51
von Goos
FlorianBecker hat geschrieben:Also eigentlich weiß ich nicht, ob du aus Langeweile fragst, oder es wirklich nicht weißt.
Ok, erwischt

Ein bissl Langeweile war auch dabei.
Ansonsten find ichs schoen, wenn das hier mal wieder jemand liest und dann auch verstehen kann was da genau abgeht.
Warum also nicht n bissl drueber reden?
FlorianBecker hat geschrieben:
Der Vorteil besteht darin, dass du diese Header nicht in den Objekten hältst, damit auf unterschiedlichen Compilern Zeit und Platz sparst.
Ein weiterer Vorteil waer vielleicht noch, dass man Header-in-Header Konstrukte und damit verbundene Probleme vermeidet.
FlorianBecker hat geschrieben:
Was das mit Pointer und Referenzen zu tun hat?
QButton *btnEins;
hier kannst du class QButton verwenden
QButton btnEins;
hier musst du den Header verwenden.
Das Beispiel is soweit ja richtig, aber es funktioniert trotzdem mit Pointern und Referenzen.
Es geht also sowohl ein
QButton *btnEins;
als auch ein
void myFunc(QButton&);
aber kein
QButton btnEins;
Goos
Verfasst: 12. April 2006 20:37
von Christian81
Goos hat geschrieben:
void myFunc(QButton&);
Bist du Dir da sicher? Soweit ich mich bei kdelibs4 dran errinnern kann (ich habe es derzeit aufgegeben kdelib4 mit msvc zu kompilieren...) mag das der MSVC nicht -> der folgende Header
Code: Alles auswählen
class myTempClass;
void doSomething(myTempClass &cls);
gibt mit MSVC einen Compilerfehler (denke ich)
Verfasst: 12. April 2006 21:10
von Goos
Christian81 hat geschrieben:Code: Alles auswählen
class myTempClass;
void doSomething(myTempClass &cls);
gibt mit MSVC einen Compilerfehler (denke ich)
Jo, dass das ganze in Bezug auf MSVC und Templates nicht so wirklich funktioniert ist bekannt. Weiss ich zumindest von MSVC 6. Wie es in spaeteren Versionen ausschaut kann ich nicht sagen.
Deshalb sollte man das ganze wohl eher nicht auf Templates anwenden.

Ansonsten ist das mit den Referenzen aber kein Problem.
Goos
Verfasst: 13. April 2006 01:25
von patrik08
Gut .... mit class begreife ich wie es einigermasse geht... (von php .. )
aber wie kann ich so eine class anwenden?
Code: Alles auswählen
template <class X> void swapargs(X &a, X &b)
{
X temp;
temp = a;
a = b;
b = temp;
}
ich weiss das die argumente ausgetausch werden ( der name ++ meine C biebel) ... und der compiler macht fuer jeden type eine version was er im c code findet wo noetig ist.. ... sei es Qtsring char ecc.... aber in der praxis?
Verfasst: 13. April 2006 06:44
von Christian81
patrik08 hat geschrieben:ich weiss das die argumente ausgetausch werden ( der name ++ meine C biebel) ... und der compiler macht fuer jeden type eine version was er im c code findet wo noetig ist.. ... sei es Qtsring char ecc.... aber in der praxis?
Schau Dich doch in Qt um - dort gibt es massenweise Template-Klassen (QList, QVector, QMap, QHash, ...)