Wie kann ich cout << myclass verwenden?

82

myclass ist eine von mir geschriebene C ++ - Klasse und wenn ich schreibe:

myclass x;
cout << x;

Wie kann ich Ausgang 10oder 20.2, wie ein integeroder floatWert?

ali
quelle

Antworten:

100

In der Regel durch Überladung operator<<Ihrer Klasse:

struct myclass { 
    int i;
};

std::ostream &operator<<(std::ostream &os, myclass const &m) { 
    return os << m.i;
}

int main() { 
    myclass x(10);

    std::cout << x;
    return 0;
}
Jerry Sarg
quelle
9
Beachten Sie, dass , wenn myclassalle hat privateFelder, und Sie wollen , operator<<()um sie auszugeben, myclasserklären sollte std::ostream& operator<<(std::ostream&, myclass const&)als Freund.
Justin Time - Stellen Sie Monica am
3
Sollte das nicht const myclass &mstattdessen sein myclass const &m?
Nubcake
3
@Nubcake: Nein. Für den Compiler bedeuten die beiden dasselbe, aber ich würde das Präfixformular immer noch als falsch betrachten. Um eine C ++ - Deklaration zu lesen, beginnen Sie mit der Deklaration und arbeiten sich nach außen vor. constNach dem Typ steht : m is a reference to a const myclass. Vor dem Typ steht "m ist ein Verweis auf eine Myclass-Konstante", die genau zwischen bedeutungslos und wirklich ungrammatisch liegt
Jerry Coffin,
1
Stellen Sie für alle, die so verwirrt sind wie ich, die Überladung des Operators außerhalb Ihrer Klassendefinition (genau wie im Beispiel).
Umnikos
1
@ Lorenzo: Nein, es kann keine Mitgliedsfunktion sein. Weitere Informationen finden Sie unter stackoverflow.com/a/9814453/179910 .
Jerry Coffin
22

Sie müssen den <<Bediener überladen ,

std::ostream& operator<<(std::ostream& os, const myclass& obj)
{
      os << obj.somevalue;
      return os;
}

Wenn Sie dies tun cout << x(wo in Ihrem Fall xvom Typ myclassist), wird alles ausgegeben, was Sie in der Methode angegeben haben. Im obigen Beispiel wäre es das x.somevalueMitglied.

Wenn der Typ des Elements nicht direkt zu einem hinzugefügt werden ostreamkann, müssen Sie den <<Operator auch für diesen Typ mit derselben Methode wie oben überladen .

Rich Adams
quelle
4
Das ist der Linksschichtoperator, nicht der "Stream-Operator". Im Kontext von Iostreams ist es entweder der Einfüge- oder der Extraktionsoperator, aber niemals der Stream-Operator.
Billy ONeal
1
Entschuldigung, ja, du hast recht. So habe ich es in meinem Kopf genannt, da ich es normalerweise nur beim Umgang mit Streams benutze. In diesem Fall wäre es, wie Sie sagen, der Einfügeoperator und nicht nur der Stream-Operator. Ich habe meine Antwort aktualisiert, um dieses Bit zu entfernen.
Rich Adams
14

Es ist sehr einfach, implementieren Sie einfach:

std::ostream & operator<<(std::ostream & os, const myclass & foo)
{
   os << foo.var;
   return os;
}

Sie müssen einen Verweis auf os zurückgeben, um den Auslauf zu verketten (cout << foo << 42 << endl)

Tristram Gräbener
quelle
-3

Alternative:

struct myclass { 
    int i;
    inline operator int() const 
    {
        return i; 
    }
};
Emil Mocan
quelle