Konstruktoren erstellen



  • Hallo bin neu hier und vielleicht könnt ihr mir weiterhelfen.

    Momentan lerne ich C++ und stoße immer wieder auf viele neue Sachen. Aktuell bin ich beim Konstruktor mit Elementinitialisierungsliste.

    Ein Konstruktor ist eine Methode, die einer Variablen konstante Werte zuordnet oder?

    Wie könnte ein Konstruktor aussehen? Auf was muss man beim Erstellen besonders achten?

    Wenn ich z. B. das hier habe, wie könnte ein Konstruktor zu Rechteck aussehen?

    class Rechteck
    {
    public:
    long laenge,breite,l,b;

    void inhalt_berechnen()
    {
    long inhalt = laenge * breite;
    cout << " Der Flaecheninhalt des Rechtecks ist: " << inhalt << endl;
    }
    }

    Rechteck::Rechteck (?,?,)
    {
    laenge = 2;
    breite = 3;
    }

    Ist das so richtig? Was gehört jedoch in die Klammer?

    Danke schon mal



  • Erstmal würde ich die [ cpp] - Tags verwenden.

    Zu deiner Frage:

    class Rechteck
    {
    public:
      Rechteck(long plaenge, long pbreite); // Konstruktor muss auch in der Klassendefinition auftauchen 
      long laenge, breite; // Wozu brauchst du l und b?
    
      void inhalt_berechnen()
      {
      long inhalt = laenge * breite;
      cout << " Der Flaecheninhalt des Rechtecks ist: " << inhalt << endl;
      }
    }; // Nicht das ; vergessen!
    
    Rechteck::Rechteck (long plaenge, long pbreite): laenge(plaenge), breite(pbreite) { } // Das hinter dem : ist die Initialisierungsliste
    

    Du könntest den Konstruktor auch folgendermaßen schreiben:

    Rechteck::Rechteck (long plaenge, long pbreite)
    {
      laenge = plaenge;
      breite = pbreite;
    }
    

    Das wäre die Variante ohne Initialisierungsliste. Die Initialisierungslisten vermeiden allerdings unnötiges kopieren und sind bei konstanten Variablen auch nötig.

    MfG,
    ScRaT

    PS: Ich hoffe ich hab' nichts falsches gesagt. Bin selbst noch Anfänger.



  • Wie würde so eine Initialisierungsliste aussehen?



  • Sorry, die Initialisierungliste steht mit dabei, hatte ich nicht gesehen.

    Hab noch eine Frage. Habe ich eigentlich die Möglichkeit vorher Länge und Breite abzufragen und diese dann dem Konstruktor zu übergeben?

    Danke.



  • Mit was für einem Buch lernst du eigentlich C++? Vielleicht solltest du mal ein wenig weiter lesen, da werden bestimmt ein paar deiner Fragen noch beantwortet.

    #include <iostream>
    
    class Rechteck
    {
      public:
        // Attribute
        long laenge;
        long breite;
    
        // Konstruktor
        Rechteck(long plaenge, long pbreite);
    
        // Methoden
        long inhalt_berechnen();
    };
    
    Rechteck::Rechteck(long plaenge, long pbreite)
      : laenge(plaenge), breite(pbreite) // Initialisierungsliste
    { }
    
    long Rechteck::inhalt_berechnen()
    {
      long inhalt = laenge * breite;
      std::cout << "Der Flaecheninhalt des Rechtecks ist " << inhalt << std::endl;
    }
    
    int main()
    {
       long laenge = 0;
       std::cout << "Laenge: ";
       std::cin >> laenge;
    
       long breite = 0;
       std::cout << "Breite: ";
       std::cin >> breite;
    
       // Mit dem Konstruktor ein neues Objekt anlegen
       Rechteck r(laenge, breite);
    
       // Methode des Objektes aufrufen
       r.inhalt_berechnen();
    }
    


  • Danke.

    Versteh auch, wie du es gemacht hast, wär jedoch nicht drauf gekommen.

    Ich versuche jetzt mal eine neue Klasse zu erstellen und dann von der Klasse Rechteck zu erben und für die neue Klasse wieder einen Konstruktor zu erstellen.

    Z. B. neue Klasse Quader und dann mit dem Konstruktor die Höhe initialisieren. Vielleicht klappts.



  • Goleo schrieb:

    Ich versuche jetzt mal eine neue Klasse zu erstellen und dann von der Klasse Rechteck zu erben und für die neue Klasse wieder einen Konstruktor zu erstellen.

    Z. B. neue Klasse Quader und dann mit dem Konstruktor die Höhe initialisieren. Vielleicht klappts.

    Schlechte Idee, denn ein Quader IST KEIN Rechteck. Also lass die Vererbung hier weg.



  • Eine Frage hätte ich noch, wieso muss ich eigentlich plaenge und pbreite mit angeben?



  • Goleo schrieb:

    Eine Frage hätte ich noch, wieso muss ich eigentlich plaenge und pbreite mit angeben?

    Wie meinst du das? Du kannst auch einen Konstruktor schreiben, der keine Parameter bekommt. Du kannst auch 10 verschiedene Konstruktoren schreiben.

    Rechteck()
      : laenge(0), breite(0)
    { }
    Rechteck(long plaenge)
      : laenge(plaenge), breite(0)
    { }
    Rechteck(long plaenge, long pbreite)
      : laenge(plaenge), breite(pbreite)
    { }
    Rechteck(const String& pnutzlos)
      : laenge(4), breite(2)
    { std::cout << pnutzlos << std::endl; }
    //[...]
    int main()
    {
      // Objekte mit den verschiedenen Konstruktoren erstellen
      Rechteck a();
      Rechteck b(42);
      Rechteck c(42, 42);
      Rechteck d("Nutzloser Quatsch");
    }
    


  • So, hab alles bis hierher verstanden und auch soweit gemacht.

    Jetzt habe ich hier eine Übungsaufgabe, in der steht

    Schreiben Sie eine von Rechteck abgeleitete Klasse Quader mit dem zusätzlichen
    Attribut Hoehe, einer entsprechenden Methode inhalt_berechnen() und einem
    Konstruktor mit Elementinitialisierungsliste.
    Ergänzen Sie eine Klassenvariable Anzahl, die angibt, wie viele Quader-Instanzen
    erzeugt wurden. Geben Sie am Ende des Programms die Anzahl der Instanzen auf
    dem Bildschirm aus.

    Bei mir hätte jetzt die Klasse Quader von Rechteck geerbt und damit es ja ein Quader wird, bräuchte ich noch die Höhe, die müsste ich dann ja auch vom Benutzer erfragen und dann wiederum in den Konstruktor vom Quader initialisieren.



  • Schreiben Sie eine von Rechteck abgeleitete Klasse Quader

    So eine blöde Aufgabe. Denke nicht, es sei richtig, so vorzugehen. Wie schon gesagt: Ein Quader ist kein Rechteck, folglich sollte man nicht öffentlich vererben! Nur weil ein Quader ebenfalls eine Breite und Länge hat, und zusätzlich noch etwas mehr, ist er eben doch kein Rechteck. Man soll ihn also auch nicht als Rechteck ansprechen können.

    Vielleicht dazu passend die Geschichte von Herrn Bebel.



  • Würde es so funktionieren?

    class Quader : public Rechteck
    {
          public: long hoehe;
                  long volumen_berechnen ();
                  Quader (long phoehe);
    }
    
    Quader::Quader (long phoehe)
    {
                   hoehe = phoehe;
    }
    
         long Quader::volumen_berechnen ()
         {
              long volumen = laenge * breite * hoehe;
              cout << "Das Volumen des Quaders ist " << volumen << endl;
    

    Ich würde in der int main dann wieder nach der Höhe fragen



  • Kann man mehr Rechtecke anlegen, ohne einen Destruktor zu verwenden?



  • Goleo schrieb:

    Kann man mehr Rechtecke anlegen, ohne einen Destruktor zu verwenden?

    Klar, wieso sollte das nicht gehen?

    Du hast auch meine Frage noch nicht beantwortet, mit welchem Buch/Tutorial du arbeitest.



  • Als Buch verwende ich von Ulla Kirch-Prinz, Peter Prinz
    C++ Lernen und professionell anwenden

    Jedoch finde ich die Erklärungen zu den Beispielen etwas mager dazu.

    Kannst du mir ein Besseres empfehlen? Kennst du zufällig eines?


Anmelden zum Antworten