Klassen in C++



  • Hallo an alle! 🙂

    Ich lerne seit ca 2 Monaten C++ aus Eigeninitiative.
    Mir persönlich gefällt das Programmieren sehr.
    Ich lerne derzeit aus dem Buch "Einstieg in die Programmierung in C++" von Bjarne Stroustrup.
    Meiner Meinung nach ein gutes Buch.

    Zu meinem Problem!
    Ich verstehe das Thema Klassen nicht.
    Ich habe schon ettliche Turtorials durch. die es im Internet gibt.
    Für was brauche ich Klassen?

    Vielen Dank im Voraus



  • Zagatho_zero87 schrieb:

    Für was brauche ich Klassen?

    Du musst dich von der Vorstellung trennen, dass du sie bräuchtest. Du brauchst aber auch kein while und kein for, wenn du goto hast. Klassen sind also ein Mittel zur Codeorganisation. Da das ein sehr komplexes Thema mit vielen Ansichten und Stilfragen ist, wird dir niemand eine allgemeingültige Antwort geben können.

    Das "große" Hauptfeature von Klassen sind halt Destruktoren* bzw. RAII. Du legst alle Objekte (Instanzen einer Klasse) auf dem Stack an, diese können jetzt "innerhalb" des Objekts Speicher anforden, und im Destruktor wird alles sicher freigegeben.

    So z.B. funktioniert std::vector:

    int main()
    {
      std::vector<int> v(50000); // 50000 Elemente auf dem Heap reserviert.
    } // Destruktor gibt alles wieder frei.
    

    Ansonsten gibt es da noch Kapselung, Polymorphie, virtuelle Vererbung und was nicht alles, aber über den Sinn dieser Konzepte musst du dir wohl selbst ein Bild machen.

    * Gleich kommen die Java Fanboys aus ihren Löchern gekrochen. 🤡

    Edit:
    Normale Vererbung könnte man ja noch schnell durchsprechen. Nimm z.B. die Möglichkeit operator << für std::ostream zu überladen:

    std::ostream& operator << (std::ostream& stream, Foo f)
    {
      return stream << "Foo: " << f.i << " - " << f.j;
    }
    

    Du kannst diesen Operator jetzt mit jedem Objekt einer Klasse nutzen, die von std::ostream erbt, und zwar ohne manuell Pointer hin und her zu casten.



  • Hallo Klassen helfen einem den überblick zu behalten. Wenn du z.b. ein großes Programm schreibst dann ist es schon sinnvoll Klassen zu verwenden ansonsten landest du vielleicht im Chaos. Aber wenn du was im Bezug auf Klassen nicht verstehst dann frag hier doch einfach nach. 🙂



  • Danke für die schnelle Antwort! 🙂

    @cooky451
    Ich versteh was du sagen willst! im Buch sind das auch ein paar 100Seiten, in denen die Klassen und das Klassenprinzip erklärt wird.
    Es Prinzip von den Klassen verstehe ich ja(mit den ganzen Konstruktoren, Destruktoren, private und public).
    Nur warum das Ganze mit privat und public... das versteh ich nicht und natürlich für was genau.



  • Den Vorteil/Sinn der Klassen wirst du dann erkennen, wenn du ein Problem ohne sie lösen sollst. Und dann die Lösung in der Klassen-Variante siehst.

    Ich konnte damals, als ich mit OOP anfing, auch den Sinn und Zweck nicht erkennen. Erstens weil das Buch (mit dem ich lernte) bei den Haaren herbei gezogene OO-Beispiele hatte. Und weil ich keine Praxiserfahrung in OOP hatte. Die Genialität und den Sinn habe ich erst verstanden, als ich ein größeres C++-Projekt erweitern/ändern mußte. Das ging so einfach, das ich im Büro vor dem Rechner saß, und laut sagte: "Wow! Das genial! So funktioniert das also mit den Klassen.". Man muß in einem Projekt ein Problem lösen damit einem ein Licht aufgeht.

    Wohlgemerkt hatte ich Jahre vorher in Assembler programmiert. Aber OOP ist einfach eine andere Welt.

    Mach einfach erstmal Programmierung weiter. Du wirst einfach Erfahrung sammeln müssen, nicht nur was die Klassen angeht. Es gibt so viele Themen in der Software-Entwicklung, du kannst das alles gar nicht am Anfang begreifen und richtig machen. Selbst nach 10 Jahren werden dir andere Programmierer Tips & Tricks beibringen.



  • Zagatho_zero87 schrieb:

    Nur warum das Ganze mit privat und public... das versteh ich nicht und natürlich für was genau.

    Das ist eine Art Dokumentation, die direkt im Code stattfindet, und deswegen sicher nicht überlesbar ist. (Auf private Member kann man von außen nicht zugreifen, auch wenn man die Doku konsequent ignoriert.)



  • Hallo Zagatho_zero87,
    zuerst google doch mal selbst mit "wozu klassen" und lese auch die Artikel, welche sich nicht nur mit C++ befassen.
    Es gibt für mich einerseits der Vorteil, dass ich Software "objektorientiert" planen kann (habe dann Klassen welche reale Objekte widerspiegeln), und technische Anforderungen in Klassen bündeln kann (habe dann z.B. alle Funktionen einer TCP Verbindung in technische TCP-Klassen gesammelt).
    Z.B. hat eine Klasse Hotel mehrere Zimmer. Die Klasse Zimmer hat u.a. eine Bettenanzahl und einen Preis, welches ich über Methoden der Klasse Zimmer abfragen kann, buchen kann ich nur über eine Methode des Hotels etc. Ich finde also meine Methoden in den fachlichen Klassen.
    Dann ist der technische Aspekt nicht zu unterschätzen. Stelle Dir vor, Du willst über eine RS232-Schnittstelle mit einer Instanz kommunizieren. Den nötigen Code packst Du in eine RS232-Klasse. Jetzt kommt die Anforderung, über eine XY-Schnittstelle zu kommunizieren. Das Protokoll soll das gleiche sein. Also eine gemeinsame Oberklasse für die gemeinsamen Sachen wie Protokoll bauen und auseinandernehmen etc. und das spezifische wie Verbindungsauf- und Abbau etc. in den ursprünglichen Klassen belassen. Wenn richtig gemacht, kann die Applikation nur mit Aufrufen von virtuellen Methoden der Unterklasse auskommen.

    Gruß Helmut



  • Zagatho_zero87 schrieb:

    Für was brauche ich Klassen?

    In erster Linie geht es eigentlich darum, eigene Datentypen bauen zu können, die man dann relativ leicht verwenden kann. Beispielsweise ist der Typ std::string als Klasse implementiert. Du kannst diesen Typ (fast) wie jeden anderen eingebauten Typ (int, double, etc) behandeln. Du kannst Variablen davon anlegen, denen "Werte" zuweisen, etc. Stück für Stück kann man sich aus einfacheren Typen komplexere Datentypen bauen. Das schöne dabei ist, dass man als Anwender nicht genau wissen muss, wie so ein Datentyp genau (intern) funktioniert. Solange der Zweck und die Schnittstelle klar ist, kannst Du den Typ erfolgreich verwenden. Abstraktion und Datenkapselung würde man das nennen.


Log in to reply