Unterschied zwischen Header-Datei und "class"

Alles rund um die Programmierung mit Qt
Antworten
oberschlingel
Beiträge: 85
Registriert: 11. April 2006 09:25
Wohnort: Berlin

Unterschied zwischen Header-Datei und "class"

Beitrag von oberschlingel »

Eine (vermutlich sehr doofe) Frage:
Was ist der Unterschied, wenn ich in meiner Header-Datei #include <QButton> schreibe, oder class QButton; ?

Danke!
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag 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
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag 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
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag 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.
oberschlingel
Beiträge: 85
Registriert: 11. April 2006 09:25
Wohnort: Berlin

Beitrag von oberschlingel »

Darf ich dann nochmal dumm fragen:

Wann verwende ich

Code: Alles auswählen

QButton *btnEins;
und wann

Code: Alles auswählen

QButton btnEins;

?
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Das war nur ein Beispiel, du solltest QButton nur als QButton *btnEins benutzen. Es ging nur um die Veranschaulichung.
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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)
MfG Christian

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

Beitrag 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. :D
Ansonsten ist das mit den Referenzen aber kein Problem.


Goos
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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, ...)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten