Jak używać cout << myclass

82

myclass to klasa C ++ napisana przeze mnie i kiedy piszę:

myclass x;
cout << x;

Jak wyprowadzić 10lub 20.2, jak integerlub floatwartość?

ali
źródło

Odpowiedzi:

100

Zwykle przez przeciążenie operator<<dla Twojej klasy:

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 Coffin
źródło
9
Zauważ, że jeśli myclassma jakieś privatepola i chcesz operator<<()je wypisać, myclasspowinieneś zadeklarować std::ostream& operator<<(std::ostream&, myclass const&)jako znajomego.
Justin Time - Przywróć Monikę
3
Czy nie powinno to być const myclass &mzamiast myclass const &m?
Nubcake
3
@Nubcake: Nie. Jeśli chodzi o kompilator, te dwa oznaczają to samo, ale nadal uważam, że prefiks jest nieprawidłowy. Aby odczytać C ++ oświadczenia zacząć od tego, co jest uznane, i swój sposób pracy na zewnątrz, a constpo rodzaju, to mówi: m is a reference to a const myclass. Z tym przed typem mówi, że "m jest odniesieniem do stałej myclass", która znajduje się na nierównej krawędzi między bezsensownym a naprawdę niegramatycznym.
Jerry Coffin
1
Dla każdego tak zdezorientowanego jak ja, umieść przeciążenie operatora poza definicją klasy (tak jak w przykładzie).
umnikos
1
@Lorenzo: Nie, to nie może być funkcja członkowska. Więcej informacji można znaleźć na stronie stackoverflow.com/a/9814453/179910 .
Jerry Coffin
22

Musisz przeciążać <<operatora,

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

Następnie, kiedy to zrobisz cout << x(gdzie xjest typu myclassw twoim przypadku), wypisze wszystko, co powiesz mu w metodzie. W przypadku powyższego przykładu byłby to x.somevalueczłonek.

Jeśli typu elementu członkowskiego nie można dodać bezpośrednio do elementu członkowskiego ostream, należy również przeciążyć <<operator dla tego typu przy użyciu tej samej metody, co powyżej.

Rich Adams
źródło
4
To jest lewy operator zmiany, a nie „operator strumienia”. W kontekście Iostreams jest to operator wstawiania lub wyodrębniania, ale nigdy nie jest operatorem strumienia.
Billy ONeal
1
Przepraszam, tak, masz rację. Tak właśnie nazwałem to w mojej głowie, ponieważ używam go tylko w przypadku strumieni. W tym przypadku byłby to operator wstawiania, jak powiedziałeś, a nie tylko operator strumienia. Zaktualizowałem odpowiedź, aby usunąć ten kawałek.
Rich Adams,
14

to bardzo proste, po prostu zaimplementuj:

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

Musisz zwrócić odniesienie do os, aby połączyć outpout w łańcuch (cout << foo << 42 << endl)

Tristram Gräbener
źródło
-3

Alternatywny:

struct myclass { 
    int i;
    inline operator int() const 
    {
        return i; 
    }
};
Emil Mocan
źródło