Hilfe fürs Verstehen von C++ gesucht!

Matthias Reitinger hat gesagt.:
Deshalb gilt die allgemeine Faustregel: in mehreren Übersetzungseinheiten verwendete Deklarationen gehören in eine gemeinsam genutzte .h-Datei, deren Definitionen in eine .cpp-Datei.
Ich benutze außerdem immer IF-Bedingungen als Präprozessoranweisungen:
C++:
// z.B. myclass.h
#IFNDEF MYCLASS_H
  #DEFINE MYCLASS_H

class MyClass
{
  //...
};

#ENDIF
Damit wird nie eine h-Datei doppelt eingebunden!

Matthias Reitinger hat gesagt.:
Dabei werden u.a. externe Verweise aufgelöst und die Funktion mit dem Namen main als Einsprungspunkt der Anwendung gesetzt.
Der Name der Einsprungspunktfunktion hängt aber auch vom Typ der Applikation ab, z.B. bei Windows-Applikationen ist es WinMain.
 
Zuletzt bearbeitet:
Ich benutze außerdem immer IF-Bedingungen als Präprozessoranweisungen:
C++:
// z.B. myclass.h
#IFNDEF MYCLASS_H
  #DEFINE MYCLASS_H

class MyClass
{
  //...
};

#ENDIF
Damit wird nie eine h-Datei doppelt eingebunden!
Das ist wieder eine andere Baustelle. Wenn du in einer Headerdatei eine Definition hast und diese in mehreren Übersetzungseinheiten einbindest, dann helfen solche Include-Wächter leider nicht. Man sollte sie aber natürlich trotzdem verwenden, um mehrfache Deklarationen in einer Übersetzungseinheit zu verhindern.

Der Name der Einsprungspunktfunktion hängt aber auch vom Typ der Applikation ab, z.B. bei Windows-Applikationen ist es WinMain.
Ja, man kann die Einsprungsfunktion natürlich je nach Linker auch anpassen. Der Standard ist aber main. Ich wollte meine Erklärung nicht noch komplizierter machen als sie eh schon ist ;)

Grüße,
Matthias
 
Was ist der unterschied zwischen Header- und den Source-Files? Wieso schreibt man seinen Code (wie in Java) nicht einfach in einen Dateityp? Wieso steht in C++ eine Klasse mal in einer .cpp, mal in einer .h Datei?
Wieso werden Dialoge mit der Endung .rc gespeichert? Was hat das für einen Sinn? Ein Dialog wird (ich habe keine Ahnung) wie in Java doch auch einfach Code sein und in einer normalen Datei stehen ...

Hallo,

das zerlegen einer Klasse in eine Header- (*.h) und eine Source-Datei (*.c) wird auch deshalb gemacht, um die Schnittstelle von der Implementierung zu trennen.

Die Source-Datei einer Klasse A inludiert immer die Header-Datei (Export-Schnittstelle). Somit ist die Source-Datei von der Header-Datei abhängig, da sie die Header-Datei implementieren muss.

Wenn jetzt eine Klasse B die Klasse A verwenden möchte, includiert die Source-Datei der Klasse B die Header-Datei von Klasse A. Somit ist die Implementierung der Klasse A (Source-Datei) von der Implementierung der Klasse B komplett entkoppelt und kann bei bedarf durch eine andere Implementierung ausgetauscht werden.

Dieses Austauschen von Implementierungen ist z. B. dann von Vorteil wenn es sich um Klassen handelt, die direkt auf einer Hardware arbeiten, betriebssystemspezifische Bibliotheken verwenden oder ein bestimmten Kommunikations- oder Datenbank-Protokoll verwenden. Somit lässt sich eine Anwendung durch das Austauschen von Implementierungen systematisch auf eine andere Hardware-Plattform oder auf ein anderes Betriebssystem portieren oder die Übertragung und Speicherung von Daten kann durch andere Konzepte erfolgen.

Es ist auch darauf zu achten, dass in der Header-Datei auch nur das steht, was den Aufrufer der Klasse auch interessiert. In C hab ich es schon oft erlebt, dass sämtliche typedefs und defines in das Header-File geschrieben wurden. Das ist natürlich nicht richtig. Nur das was aussen sichtbar sein soll, kommt in die Header-Datei.

Durch dieses Konzept der Programmiersprache C lässt sich bei richtiger Anwendung eine loose Kopplung der entstehenden Software erreichen. Ein loose Kopplung trägt zu einer hohen Qualität der Software bei ...

Du solltest auch mal versuchen in JAVA Interfaces zu verwenden, wenn es sinnvoll ist.

Gruß

Tikonteroga
 
Zuletzt bearbeitet:
Vielen Dank an alle!
Es entwirrt sich in der Tat langsam.

@sheel
Wenn ich jetzt also eine dieser GUI-Libraries downloade, dann ist es möglich diese ähnliche wie in Java zu verwenden und ein Fenster per Code zu erreichen?
Beim Anbieten meiner Software müsste ich dann jedoch diese GUIs mitliefern, da sonst die Datei nicht ausgeführt werden kann. Verstehe ich auch das richtig?
 
Wenn ich jetzt also eine dieser GUI-Libraries downloade, dann ist es möglich diese ähnliche wie in Java zu verwenden und ein Fenster per Code zu erreichen?

Ja. Wie ähnlich es zu Java ist, kommt auf die verwendete Library an.
Aber da eine ernstzunehmende/bekannte auch eine Doku bzw. Tutorials online hat, kannst du dich ja im Vorraus über die einzelnen Libs informieren und dir eine aussuchen, die dir gefällt.

Beim Anbieten meiner Software müsste ich dann jedoch diese GUIs mitliefern, da sonst die Datei nicht ausgeführt werden kann. Verstehe ich auch das richtig?

Kommt drauf an, ob die Lib dynamisch/statisch (dll oder nicht) ist.

Wenn außer h- und lib-Dateien auch dlls dabei sind (ist am häufigsten), müssen die dlls immer beim Programm dabei sein.
(Die h/lib-Dateien braucht man nur zum kompilieren, also Weiterverbreitung nicht nötig)

Wenn nur h/lib-Dateien sind, ist es eine statische Lib.
Kann man sich so vorstellen, dass die dll mit zum Hauptprogramm in die Exe-Datei reingestopft wird.
Die kompilierte Exe braucht dadurch mehr Speicherplatz; man muss aber keine weiteren Dateien mitgeben.

Im Idealfall hast du eine Opensource-Library, die kannst du je nach Bedarf selber statisch/dynamisch kompilieren.
 
Beim Anbieten meiner Software müsste ich dann jedoch diese GUIs mitliefern, da sonst die Datei nicht ausgeführt werden kann. Verstehe ich auch das richtig?

Ich denke, dass das eher nicht ein Problem darstellen sollte. Aber wie sheel sagte, kannst du auch die Library in die EXE packen.


Wenn du jetzt eine GUI Lib benutzen willst, stellt sich noch die Frage welche?!
Diese Frage habe ich mir auch vor einiger Zeit gestellt.
Ich kann dir nur empfehlen, gründlich nachzudenken, denn Umsteigen sollte vermieden werden ;)
Hier habe ich eine Liste gefunden: Click!
 
Vielen Dank für die Liste.
Jedoch kann ich aus den reinen Beschreibungen der verschiedenen Bibliotheken nicht wirklich auf ihre Benutzerfreundlichkeit schliessen.
Für welche hast du dich denn schlussendlich entschieden? Welche ist Java am nächsten?
 
Ich selber habe mich nach langem Überlegen für wxWidgets entschieden.

Ich finde wxWidgets beinhaltet neben Qt die meisten Ports zu Betriebssystemen.
Doch an Qt hat es mich gestört, das ich Lizenzgebühren zahlen muss, falls ich mein Projekt kommerziell veröffentliche!

Zu wxWidgets gibt auch ein sehr gutes Forum dazu, man bekommt dort eine Antwort innerhalb eines Tages!
(Ich sage damit nicht, das es bei anderen nicht so ist!)


Ich kenne mich in Java fast gar nicht aus (nur 1x Hello World geschrieben :D).
Aber ich kann sagen, das wxWidgets auch objekt-orientiert wie Java ist.

Nur das kompilieren ist ein wenig kompliziert, aber du kannst mich gerne anschreiben, dann kann ich dir helfen ;)
 
Zurück