Konstruktor



  • Ich hoffe hier findet sich wer, der mir des leicht erklären kann. Ich checke des net so sehr.



  • Schüler schrieb:

    Ich hab hier nochmal eine Frage zu Konstruktoren und zwar von abgeleitenen. Ich versuche gerade des erlernte selber anzuwenden damit es weng besser sitzt.
    Aber ich hab hier ein Problem und ich weiss net so genau woran des liegt. Ich schätze mal an der übergabe zwischen den einzelnen Konstrukoren.

    Ähm.. Was hast du denn für ein Problem? Compiler-Fehlermeldung?
    Bei mir treten keine auf. Nach logischen Fehler hatte ich aber keien Zeit zu suchen. Raten können wir leider nicht. 😃

    mal ne Frage nebenei, habt ihr euch euer Wissen in Programmieren selber angeeignet oder auch durch Studium angeeignet. Würde mich nur mal interessieren.

    Ich habe mir alles selber angeeignet. Aus Büchern und natürlich übers Internet. Studieren kann ich noch nicht, dazu bin ich noch zu jung. Steck grade mitten in der schriftlichen Prüfung der Realschule. (morgen Englisch Prüfung 😮 😮 )



  • okay habe das Problem gelöst. Ich hätte nur eine andere Frage ich mache deswegen mal kein neues Topic auf sondern schreibe es kurz hier rein, weil auch mein code hier drinnen steht.

    abgeleitete Klasse verwendet Funktion aus Basisklasse -> okay das geht und ist klar

    kann aber die verwendete Funktion noch eine Funktion aus der abgeleiten mit einbauen

    wie z.b.

    //Basisfunktion

    void basis::getalldaten() {
        cout << "Artikelname             = " << name  << endl
             << "Preis des Artikels      = " << preis << " Euro" << endl
             << "Lagermenge des Artikels = " << menge << " Stueck" << endl;
             }
    

    abgeleitete Funktion

    void fluessig::getliter() {
        cout << "Der Artikel enthaelt " << liter << endl;
    }
    


  • Verstehe zwar nich ganz. Aber ich denke du meinst es so, dass du eine neue Funktion in der abgeleitenen Klasse definieren willst. Klar geht das.



  • naja jetzt müsste ich schreiben

    int main () {
    fluessig artikel (129,120,120);
    artikel.getalldaten();
    artikel.getliter();
    

    um die ausgabe aller daten zu haben.Mein frage ist nun wie kann ich des so schreiben das des aller in einer Zeile steht.

    quasi sowas wie

    artikel.getalldaten().getliter(); /*ich weiss das geht net. ich will nur ausdrücken was ich ungefähr meine*/



  • Das kannst du machen, indem du in getalldaten() eine Referenz auf das Objekts zurückgibt, das die Memberfunktion getliter() beinhaltet. (also artikel)
    Aber wozu brauchst du denn das?

    Am Besten du redefenierst getalldaten() in deiner abgeleitenen Klasse und rufst die gibst die extra Dinger einfach aus, die dazu gekommen sind.

    Z.B. ungefähr so:

    void Derived::getAllDaten() {
        Base::getAllDaten();
        std::cout << "Der Artikel enthaelt " << liter << std::endl;
    }
    // Base::getAllDaten() wird überdeckt
    

    Ist doch viel einfacher, nicht? 🕶



  • super genauso sowas hab ich gemeint. So leutet mir des auch ein.
    Hmm ich sinngemäß brauche ich des net im Programm vielleicht. Ich will es halt einfach testen, um zu kucken was ich weiss und wie man was lösen muss. Und durch deine Lösung verstehe ich wieder ein paar Sachen mehr. Dankeschön!!!



  • Hmm hab des mal so probiert aber da bringt er mir jetzt Fehler

    can not call member function void basis::getalldaten() without objekt
    liter undeclared (first use in this function)

    net das du denkst ich wäre faul . ich hab auch nochmal jetzt im Buch gekuckt unter redefenieren aber da wurde des auch so beschrieben wie du sagst. Ich hab auch weng hin und her probiert aber ist immer das selbe.

    hier neuer Code:

    #include "fluessig.h"
    #include <iostream>
    using namespace std;
    
    void fluessig::setliter() {
        cout << "Bitte geben Sie die Liter des Produktes an: ";
        cin  >>liter;
    }
    
    void fluessig::getliter() {
        cout << "Volumen des Artikels    = " << liter << " Liter" << endl;
    }   
    
    fluessig::fluessig(double a, double b, double c) : basis(a, b) { 
        liter=c;
    
    } 
    
    void redgetdaten() {
         basis::getalldaten();
         cout << "Der Artikel enthaelt " << liter << endl; 
    
    }
    
    #ifndef _FLUESSIG_
    #define _FLUESSIG_
    #include "basis.h"
    
    class fluessig : public basis {
        private:
            double liter;
        public:
            fluessig(double a, double b, double c);
            void setliter();
            void getliter();
            void redgetdaten();
            };
    #endif
    


  • void fluessig::redgetdaten() { // hm?
        basis::getalldaten();
        cout << "Der Artikel enthaelt " << liter << endl;
    }
    

    Achja: Und warum nennst du die Funktion nicht einfach gleich?



  • ach stimmt 😃 mir war gar nicht bewusst das es hier einfach überladen wird.
    Und ich hirni hab vergessen void fluessig:: davor zu schreiben. ich muss blind gewesen sein. 🙄



  • Noch zur Richtigkeit: Du tusts nichts überladen hier. 😉
    Sondern du redefinierst die Methode in der abgeleitenen Klasse und "versteckts" daher auch die Baisklassemethode, die du direkt nun nicht mehr aufrufen kannst.


Anmelden zum Antworten