Probleme mit operator<<



  • Hallo!

    Ich habe eine Klasse entworfen in die man mit << quasi was "reinstreamen" können soll. Leider geht das nicht so ganz wie ich mir das vorstelle!

    Widget & Widget::operator<<(Object *obj)
    {
    	m_collected.push_back(obj);
    	return *this;
    }
    

    Was ist daran falsch?

    Wenn ich z.B. irgendwo schreibe:

    Object *obj = new Object;
    Widget x;
    x << obj;
    

    krieg ich eine Fehlermeldung: "error C2676: Binaerer Operator '<<' : 'class Widget' definiert diesen Operator oder eine Konvertierung in einen fuer den vordefinierten Operator geeigneten Typ nicht"

    Ach ja, ich lese auch oft, dass so ein << operator als friend implementiert werden sollte, ist das in meinem Fall notwendig?

    mfG
    July



  • Wenn du ihn als Member hast brauchst du ihn erstens nicht als friend und zweitens ist das eh falsch (ihn als Member zu haben), da sonst dein Stream nur auf der linken Seite stehen kann.

    Du musst nur dafür sorgen, dass deine Objekte implizit in so einen Stream umgewandelt werden können (d.h. für diese den op<< implementieren).



  • Ok, allerdings ist das:

    x << obj;
    

    sowieso die einzige Variante die ich verwende - Widget steht immer links und das was ich reintun will rechts.

    Du musst nur dafür sorgen, dass deine Objekte implizit in so einen Stream umgewandelt werden können (d.h. für diese den op<< implementieren)

    Was? Das heißt ich muss in meiner 'Object'-Klasse auch den << Operator definieren...? das glaub ich nicht..



  • Hast du in der Klassendeklaration den Funktionstyp richtig angegeben?



  • Optimizer schrieb:

    und zweitens ist das eh falsch (ihn als Member zu haben), da sonst dein Stream nur auf der linken Seite stehen kann.

    Wieso soll das falsch sein? Is doch hier absolut sinnvoll, dass das Objekt auf der linken Seite steht (er will ja nicht in cout oder sowas reinstreamen)



  • class Object {};
    
    class Widget {
    public:
    	Widget &operator << (Object *) {
    		cout << "object";
    		return *this;
    	}
    };
    
    int main () {	
    	Widget() << new Object << new Object;
    }
    

    und das funktioniert nicht?



  • OH SHIIIT 😡 😡 😡

    Ja danke, davie, das geht natürlich. Meins geht jetzt auch, und ratet mal an was es lag:

    Ich habe in der Quellcodedatei in der "Widget() << new Object" stand, keine #include Direktive für "Widget.h" drin gehabt!

    Diese Fehlermeldung dazu ist doch schon direkt infam...


Anmelden zum Antworten