Objektzeiger per ostream& operator << ausgeben



  • Hallo,

    ich habe da ein Problem wo ich einfach nicht weiter kommen 🙄 und auch nicht gefunden habe was mir wirklich weiterhilft.

    Ich möchte von einer Basiklasse ein Objektzeiger ausgeben, sodass ich bei dem aufruf.

    cout << *AktuellesObjket << endl;
    

    die zugehörigen Attribute ausgegeben bekomme.

    Das ist soweit alles noch einfach und ich bekomme auch den Namen den ich haben möchte raus.

    Doch nun habe ich 3 Unterklassen die jeweils noch spezielle Attribute erhalten.
    Diese kann ich leider nicht mit dem überladen Operator ausgeben.

    Kurzes Bespiel damit klar wird was ich meine.

    Basisklasse ist Geraet: string name;
    Unterklasse1 Radio: float lautstaerke;
    Unterklasse2 Herd: double temperatur;

    Nun habe ich versucht mit der Operatorüberladung in der Baisklasse Geraet

    friend ostream& operator << (ostream& os, AllgemeinesGeraet *pOp);
    

    diese Ausgabe hinzubekommen. Doch leider komme ich aber nicht an die speziellen Attribute von Radio und Heizung ran.

    Da ich zuerst versucht habe die Operatorüberladung als

    virtual
    

    zu programmieren wurde ich eins bessern belehrt da dies ja keine Methode von der Basisklasse ist und nicht funktioniert. So das ich keine Redefinition machen kann.

    Kann mir irgendjemand einne Lichtblick schenken und mich erleuchten 💡
    wie ich hinbekommen kann, dass ich auch an die Werte von meinen Unterklassen komme und die mit dem

    ostream& operator <<  ...
    

    ausgeben kann.

    Für hilfreichte Tipps und Anregungen .. wäre ich wirklich Dankbar.

    schöne Grüße
    Joe



  • Schau mal bei den Tutorials in Volkard's C++ Kurs.
    Dort wird dein Operator für ne andere Klasse überladen.



  • Danke,
    aber das ist nicht das nachdem ich suche.
    Oder ich hab jetzt doch was übersehen, da ich nur eine operator gesehen habe der ausserhalb der Klasse überladen worden ist aber nicht für eine abgeleitete Klasse was ich benötige.
    Ich möchte ja auf das Attribut für die Basisklasse zurgreifen und gleichzeitig auf das Attribut der Subklasse. (mit getmethode)

    Und da hilft mir so eine Umsetzung leider auch nichts, wenn mich jetzt nicht alles täuscht.

    Grüße
    Joe



  • class foo
    {
    public:
      virtual ~foo() { }
      virtual std::ostream& print( std::ostream& out ) const = 0;
    };
    
    std::ostream& operator<<( std::ostream& out, foo const& f )
    {
      return f.print(out);
    }
    
    std::ostream& operator<<( std::ostream& out, foo const* f )
    {
      return f->print(out);
    }
    
    class bar : public foo
    {
    public:
      bar() : x_(42) { }
      virtual std::ostream& print( std::ostream& out ) const
      { return out << "bar with [x = \"" << x_ << "\"]"; }
    
    private:
      int x_;
    };
    
    class blubb : public foo
    {
    public:
      blubb() : y_(3.14) { }
      virtual std::ostream& print( std::ostream& out ) const
      { return out << "blubb with [y = \"" << y_ << "\"]"; }
    
    private:
      double y_;
    };
    
    int main()
    {
      bar bar_;
      blubb blubb_;
      foo* stuff[] = {&bar_, &blubb_};
    
      for (std::size_t i = 0; i < sizeof(stuff)/sizeof(stuff[0]); ++i) {
        //std::cout << *stuff[i] << '\n';
        std::cout << stuff[i] << '\n';
      }
    }
    


  • hi ich bin grade bei dem gleichen problem 😉 und habe versucht deine version zu implementieren. allerdings in unterschiedlichen *.h
    leider bekomm ich dann diese fehlermeldung.....
    benutze compiler: "Visual c++ Expressedition 2005" (alles in eine datei funktioniert)

    foo.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class foo const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABVfoo@@@Z) ist bereits in test2.obj definiert.
    foo.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class foo const *)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@PBVfoo@@@Z) ist bereits in test2.obj definiert.
    E:\pg2_2006_07\loesungen\test2\Debug\test2.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
    Das Buildprotokoll wurde unter "file://e:\pg2_2006_07\loesungen\test2\test2\Debug\BuildLog.htm" gespeichert.
    test2 - 3 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    edit:
    so jetzt hab ich eines noch gemacht:
    Die Option /FORCE gesetzt, die den Linker zwingt eine gültige EXE-Datei oder DLL zu erstellen, auch wenn auf ein Symbol verwiesen wird, das nicht oder mehrfach definiert ist. .. aber ob das so sinnig ist "ich weiss net" gibs net noch nee sinnvollere variante? weil ich hab jetzt 11 warnungen ... und damit fühl ich mich net wohl.. bin ja kein microsoftprogrammierer!! was meint ihr
    habt ihr noch ein tip?

    LINK : warning LNK4075: /INCREMENTAL wird aufgrund der Angabe von /FORCE ignoriert.
    Heizung.obj : warning LNK4006: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class AllgemeinesGeraet const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABVAllgemeinesGeraet@@@Z) ist bereits in "AllgemeinesGeraet.obj" definiert; zweite Definition wird ignoriert.
    Heizung.obj : warning LNK4006: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class AllgemeinesGeraet const *)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@PBVAllgemeinesGeraet@@@Z) ist bereits in "AllgemeinesGeraet.obj" definiert; zweite Definition wird ignoriert.
    Kaffeemaschine.obj : warning LNK4006: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class AllgemeinesGeraet const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABVAllgemeinesGeraet@@@Z) ist bereits in "AllgemeinesGeraet.obj" definiert; zweite Definition wird ignoriert.
    Kaffeemaschine.obj : warning LNK4006: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class AllgemeinesGeraet const *)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@PBVAllgemeinesGeraet@@@Z) ist bereits in "AllgemeinesGeraet.obj" definiert; zweite Definition wird ignoriert.
    Praktikum_pg2_3.obj : warning LNK4006: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class AllgemeinesGeraet const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABVAllgemeinesGeraet@@@Z) ist bereits in "AllgemeinesGeraet.obj" definiert; zweite Definition wird ignoriert.
    Praktikum_pg2_3.obj : warning LNK4006: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class AllgemeinesGeraet const *)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@PBVAllgemeinesGeraet@@@Z) ist bereits in "AllgemeinesGeraet.obj" definiert; zweite Definition wird ignoriert.
    Radio.obj : warning LNK4006: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class AllgemeinesGeraet const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABVAllgemeinesGeraet@@@Z) ist bereits in "AllgemeinesGeraet.obj" definiert; zweite Definition wird ignoriert.
    Radio.obj : warning LNK4006: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class AllgemeinesGeraet const *)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@PBVAllgemeinesGeraet@@@Z) ist bereits in "AllgemeinesGeraet.obj" definiert; zweite Definition wird ignoriert.
    E:\pg2_2006_07\loesungen\Praktikum_pg2_3\Debug\Praktikum_pg2_3.exe : warning LNK4088: Abbild wird aufgrund der Option /FORCE generiert; Abbild kann möglicherweise nicht ausgeführt werden.
    Das Manifest wird eingebettet...
    Das Buildprotokoll wurde unter "file://e:\pg2_2006_07\loesungen\Praktikum_pg2_3\Praktikum_pg2_3\Debug\BuildLog.htm" gespeichert.
    Praktikum_pg2_3 - 0 Fehler, 11 Warnung(en)
    




  • Ob Includeguards beim Linken mehrerer Objekte helfen? 😉

    Definiere freie Funktionen (es geht hier um die beiden operator<<) nich vollständig in der .h Datei, sondern in einer .cpp (oder markiere sie als inline). Dasselbe gilt für ausserhalb der Klassendefinition notierte Methoden.



  • LordJaxom schrieb:

    Ob Includeguards beim Linken mehrerer Objekte helfen? 😉

    Definiere freie Funktionen (es geht hier um die beiden operator<<) nich vollständig in der .h Datei, sondern in einer .cpp (oder markiere sie als inline). Dasselbe gilt für ausserhalb der Klassendefinition notierte Methoden.

    "INLINE" <<<<<geillll !! stimmt geht wunderbar dankkkkkkkkkkeeeeeeeeeeeeeeeeee.



  • hallo,

    ich wollte mich hier nur nochmal bei finix bedanken, dein Code hat mich erleuchtet.

    Gruß
    Joe


Anmelden zum Antworten