Warum ordnet man jede Klasse (C++) einer Header- und Cppdatei zu?

... komplette Frage anzeigen

5 Antworten

zu Geht schon aber

Doppelung

Solange nur Deklarationen in den Header-Dateien stehen, können die Dateien

beliebig oft eingebunden werden. Wenn aber auch Klassendefinitionen oder andere

Definitionen, die nur einmal je Übersetzungseinheit auftreten dürfen, in den

Header-Dateien stehen, muss darauf geachtet

werden, dass sie nicht zweimal in einen Quelltext eingebunden werden.

Das hört sich einfacher an, als es ist, da manchmal Header-Dateien selbst

wieder andere Header-Dateien einbinden.

Die Header-Datei

schiff.h

enthält die Klasse

tSchiff

. Der Präprozessor kann verhindern, dass die Datei von einer

Quelltextdatei versehentlich zweimal eingebunden wird.

Mit ihm können Namen definiert werden, und er kann abfragen, ob Namen bereits

definiert wurden.

zu E1

Statische Elemente

sind Variablen, Konstanten oder Funktionen,

die pro Klasse nur einmal existieren und nicht, wie ihre

Member-Pendants, einmal pro Instanz.

zu E2

https://de.wikibooks.org/wiki/C-Programmierung:_Komplexe_Datentypen

zu E3

http://www.cpp-tutor.de/cpp/le07/funktionzeiger.html

ich erfinde bestimmt nicht das rad doppelt , also lesen was schon geschrieben wird , weil erklärt ist erklärt .

Viel glück .

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von RakonDark
18.08.2016, 14:38

fehlt bei E3 noch

Durch das implizite this-Objekt ist ein Aufruf des
Funktionspointers nicht mehr durch das einfache Ansprechen des Pointers
möglich. Die nicht-statische Funktion muss mit einem Pointer-Member-Operator ->* oder Member-Feld-Zugriff-Operator .* aufgerufen werden. Diese beiden Operatoren erzwingen die Angabe eines Objekts auf dem die Funktion operieren kann.

1
Kommentar von ZeroclawX
18.08.2016, 15:18

Hey vielen dank für die Links! Die Erklärungen sind wirklich top und ich habe jetzt sogar ein Nachschlagewerk (wikibooks)! Vorallem hat mir die Erklärung inbezüglich der Funktionszeiger gefallen. Ich werde dieser Antwort wegen den Links deshalb ein Sternchen geben.

1

Zusätzlich zum bisher Beschriebenen:

structs verhalten sich sehr ähnlich wie classes, allerdings haben sie nur öffentliche Felder als Member. (Bei C# werden sie auch auf den Stack statt auf den Heap geschoben, wie das bei C++ ist, müsste ich nachsehen.)

unions dienen v. a. dazu, extrem schwer auffindbare Bugs einzubauen. (Vgl. EQUIVALENCE in FORTRAN)
Man erklärt damit, dass zwei Variablen (auch von verschiedenen Datentypen) denselben Speicherplatz belegen sollen.
Spart ein paar Bytes, was in der Guten Alten Zeit (TM), als ein Kilobyte noch richtig Geld kostete, wirklich was ausmachen konnte.

enums sind benannte Konstante von vergleichbaren, aber zu unterscheidenden Dingen.
Beispiel:

enum Wochentag {Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag};

Der Operator -> ist eine Abkürzung für Indirektion plus Memberzugriff (müsste jetzt nachsehen, wie das bei C++ war, hab zu viel durch C# vergessen)

Funktionspointer sind im wesentlichen Funktionsvariablen. Sinnvoll, wenn wir Funktionen haben, die auf verschiedene andere Funktionen in immer wieder gleicher Weise zugreifen müssen.
Man kann im Prinzip stattdessen auch Operatorüberladung verwenden.

Beispiel: Sortieralgorithmen für verschiedenartige Objekte (ein Fall für Templates).
Hier kann man für den Vergleich eine Überladung von <, <=, >, >=, ==, != verwenden.
Oder man übergibt der Template-Funktion nicht nur ein Array, sondern auch eine Funktion (genauer: einen Pointer auf eine Funktion), die für <, == bzw. > -1, 0 bwz. +1 zurückgibt.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von ZeroclawX
18.08.2016, 15:35

Vielen Dank für die Mühe alle Fragen zu beantworten!

0

Kurz von unterwegs zu 1.

Statische Klassen sind Klassen, die keine Objektinstanzen kennen. Mir fällt kein gutes C++ Beispiel ein, aber C# verwendet für mathematische Funktionen und Konstanten die Klasse System.Math (C++ verwendet dafür einer den cmath Header, da C++ nicht streng objektorientiert ist).

Als Beispiel möge die besagte C# Klasse dennoch dienen:

Man möchte mathematische Funktionen wie cos oder Konstanten wie PI nutzen, ohne, dass dafür eine Instant gebraucht wird. Es macht sogar keinen Sinn die Instanz "Objekt der Mathematischen Funktionen und Konstanten" zu deklarieren.

Dazu deklariert man die Klasse als statisch mit dem Schlüsselwort static.

Die Klasse kennt dann natürlich keine Konstruktoren.

Antwort bewerten Vielen Dank für Deine Bewertung

Was fällt dir auf, wenn du einen Header mit der dazugehörigen CPP-Datei vergleichst?

Er ist klein und übersichtlich.

1. Simples Beispiel: static int anzahlMeerscheinchen in der Klasse Meerscheinchen.

2. Bin kein C++-Experte, soweit ich weiß sind structs einfach nur einige Datentypen in einer Adresse angeordnet, im Gegensatz zu Klassen gibt es sonst nichts darüber zu wissen, sie sind im Prinzip, wie man Klassen in C gemacht hat.  Enums sind soweit ich weiß einfach nur Zählhilfen, bei denen man einer Zahl einen Namen gibt.

3. Funktionspointer sind wohl eine Methode an nicht zur Kompilierzeit festgelegte Stellen im Programm zu springen. Enthalten einfach die Speicheradresse von Funktionseinsprungpunkten(wenn man sie nicht verschiebt). -> sehe ich als Abkürzung für *., man greift damit auf Attribute oder Funktionen eines Objektes über dessen Pointer, statt über das Objekt selbst zu.

Antwort bewerten Vielen Dank für Deine Bewertung

Du brauchst nicht zwangsweise für eine Class eine header-datei, du kannst die class auch im hauptprogramm selbst schreiben, aber mit einer vorkompilierten Header-Datei ist es übersichtlicher

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?