Alle Variables eines Objektes ausgeben lassen?



  • Hallo,
    ich würde gerne alle Elemente eines Objektes einer abgeleiteten Klasse ausgeben lassen. Das ganze soll bestenfalls durch den Aufruf eines Operators geschehen. Ich habe mich bereits etwas informiert und plane den cout Operator "<<" zu überladen um die Klasse zu printen.
    Leider werden so allerdings nur die Elemente der abgeleiteten Klasse geprintet. Ich frage mich nun wie ich es schaffen kann mit einem einzigen Aufruf von "<<" möglichst elegant sowohl die Elemente der abgeleiteten wie auch der Basisklasse auszugebenn.
    Ich habe das Szenario mal so gut wie ich kann in Pseudocode gefasst:

    Class Basis{
    private: var1;var2;
    <<operator(){
    cout << var1 << var2 ;}
    
    Class Abgeleitet:Basis{
    private: var3,var4;
    <<operator(){
    Basis::object.operator()<<var3<<var4<<endl;}
    
    main(){
    Abgeleitet object;
    object<<endl;
    }
    
    Console output: Var1 Var2 Var3 Var4
    

    Momentan würde nur der Operator aus der abgeleiteten Klasse ausgeführt werden. Ich würde allerdings gerne zunächst den operator der Basisklasse ausführen und dannach den Operator der abgeleiteten Klasse ausführen um alle Elemente ausgeben zu lassen. Funktioniert dieser Pseudocode prinzipiell oder muss ich etwas umgestalten?



  • humanica schrieb:

    in Pseudocode gefasst

    Warum? Willst du nur Pseudoantworten?



  • humanica schrieb:

    Ich würde allerdings gerne zunächst den operator der Basisklasse ausführen und dannach den Operator der abgeleiteten Klasse ausführen um alle Elemente ausgeben zu lassen.

    Und was hindert dich daran?



  • daddy_felix schrieb:

    humanica schrieb:

    Ich würde allerdings gerne zunächst den operator der Basisklasse ausführen und dannach den Operator der abgeleiteten Klasse ausführen um alle Elemente ausgeben zu lassen.

    Und was hindert dich daran?

    Wird das denn so wie ich es geplant habe funktionieren? Die Implementierung kriege ich schon hin, bzw wachse daran Fehler in ruhe zu analysieren. Es wäre aber blöd wenn die Idee falsch ist und ich viel Zeit mit der Implementierung verschwende.



  • humanica schrieb:

    Wird das denn so wie ich es geplant habe funktionieren? Die Implementierung kriege ich schon hin, bzw wachse daran Fehler in ruhe zu analysieren.

    Gehe hin und wachse ^^



  • Du könntest dir natürlich auch eine virtuelle print-Methode erzeugen und diese in dem operator<< ausgeben.

    Ansonsten ist es ja blöd, wenn du gemischt Base+Derived hast.

    #include <iostream>
    #include <vector>
    #include <memory>
    using namespace std;
    
    struct Base {
      virtual void print(ostream&os) const {os << "Base";}
    };
    
    ostream& operator<<(ostream &os, const Base& b) { b.print(os); return os; }
    
    struct Derived : Base {
      void print(ostream&os) const override { Base::print(os); os << " and Derived"; }
    };
    
    int main() {
      vector<unique_ptr<Base>> v;
      v.push_back(make_unique<Base>());
      v.push_back(make_unique<Derived>());
      for (auto &el : v) cout << *el << '\n';
    }
    


  • Vielen Dank für den Tipp, ich habe deinen Vorschlag auf mein Problem angepasst:

    main.cpp

    ostream& operator << (ostream &output,const abgeleitet &cAbgeleitet){ 
        return cAbgeleitet.vAusgabe(output);
    
    main(){
        abgeleitet cAbgeleitet("Audi",200.0,12.0);
        cout << &cAbgeleitet << endl;
    };
    

    abgeleitet.cpp

    ostream& abgeleitet::vAusgabe(ostream &output) const{
        Base::vAusgabe(output) << p_dTankinhalt
        << setw(12) << p_dGesamtVerbrauch <<endl;
        return output;
    };
    

    Base.cpp

    ostream& Fahrzeug::vAusgabe(ostream &output) const{
        output << setw(12) << p_iID <<setw(12) << p_sName;
        return output;
    };
    

    Ich verstehe nicht warum du im Operator Base einsetzt statt abgeleitet, schließlich soll doch zuerst die abgeleitete Klasse aufgerufen werden und von dort aus die Hauptklasse ausgegeben werden.
    Es kompiliert und läuft, ich erhalte jedoch offensichtlich die Adresse von Audi ausgegeben statt den eigentlichen Daten.



  • cout << cAbgeleitet << endl;
    

Anmelden zum Antworten