Objekte in Klassen



  • Ich habe angefangen C++ zu lernen und habe davor Javascript und Java gelernt. Bei C++ möchte ich wissen, wie man Objekte in Klassen benutzt. Ich möchte dabei etwas von Java bentutzen bzw. dasselbe oder etwas ähnliches wie in Java erreichen, kleines Beispiel:

    public class Container {
    private Klasse klasse;

    Container(Klasse klasse) {
    this.klasse = klasse;
    }
    }

    In C++ könnte es so aussehen:

    temlate<typename T>
    class Container {
    private:
    T klasse;
    public:
    Container(T klasse) {
    // this->klasse = klasse ?
    }

    };

    Nur gibt es hier das Problem, dass bei der private Deklaration auch gleichzeitig schon ein Objekt erzeugt wird, also anders als in Java.
    Angenommen ich möchte eine Klasse Container, die mehrere Klassen beinhaltet und somit für Struktur und Kapselung sorgt. Wie setzt man sowas um?

    Danke im Voraus 🙂



  • Warum benutzt du in C++ ein Template?
    Das Ganze sieht nach wild drauf los basteln aus. So lernst du C++ nicht.



  • Ich weiß noch nicht genau, welche Klassen ich darin speichern möchte und will das ganze variabel halten.


  • Mod

    Was du hier fragst, ist praktisch die Neuprogrammierung des Containers std::vector aus der C++-Standardbibliothek. Daher ist ein guter Leitfaden, wie die Schnittstellen für solch eine Containerklasse aussehen können eben die Schnittstelle für std::vector.

    Eine für Anfänger stark vereinfachte Darstellung, wie so ein vector intern aufgebaut ist, könnte so aussehen:

    template<class T> MyVector
    {
    private:
      T *begin;
      size_t size; 
    };
    

    Und dann mit public-Methoden, die bei Bedarf dynamisch Objekte mittels new erzeugen, auf die dann begin zeigt. Und mehr Methoden, die dafür sorgen, dass bei Kopien, Zuweisungen, Zerstörungen, usw. stets alles richtig gemacht wird und man keinen Speicher verliert.

    Insgesamt ist das ein relativ wichtiges Konzept in C++, Stichworte sind "RAII" "Rule of 3"(alt) bzw. "Rule of 5"(neu), aber andererseits ist dieses Problem auch quasi gelöst, da es eigentlich für jeden Zweck eine passende Containerklasse in der Standardbibliothek gibt, so dass man praktisch niemals selber Hand anlegen braucht, sondern einfach diese verwendet (Stichwort "Rule of 0"). In gutem C++ wird dir praktisch nie ein nicht-smarter Zeiger oder ein explizites new begegnen, die habe ich oben bloß benutzt um zu zeigen, was hinter der Fassade steckt.

    PS: Und noch die Warnung: C++ ist weder Java noch Javascript und man sollte tunlichst vermeiden, C++ wie Java zu programmieren. Es geht zwar, aber es geht nicht gut. Gerade diese Ressourcenverwaltungsgeschichten gehen in Java und C++ gänzlich anders. Ich würde sogar behaupten, dies ist der Hauptunterschied zwischen den beiden Sprachen. Und Javascript ist nochmals eine komplett andere Welt zu Java und C++ von den unterliegenden Konzepten her, aber das hast du sicherlich selber schon gemerkt.


Log in to reply