¿Cómo puedo usar cout << myclass

82

myclass es una clase de C ++ escrita por mí y cuando escribo:

myclass x;
cout << x;

¿Cómo produzco 10o 20.2, como un integero un floatvalor?

Ali
fuente

Respuestas:

100

Por lo general, sobrecarga operator<<para su clase:

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
fuente
9
Tenga en cuenta que si myclasstiene algún privatecampo y desea operator<<()generarlo, myclassdebe declararlo std::ostream& operator<<(std::ostream&, myclass const&)como amigo.
Justin Time - Reincorpora a Monica
3
¿No debería ser esto en const myclass &mlugar de myclass const &m?
Nubcake
3
@Nubcake: No. En lo que respecta al compilador, los dos significan lo mismo, pero aún así consideraría incorrecta la forma del prefijo. Para leer una declaración C ++, se parte de lo que se está declarada, y su forma de trabajo hacia el exterior, con el constdespués del tipo, que dice: m is a reference to a const myclass. Con él antes del tipo, dice "m es una referencia a myclass const", que está justo en el borde desigual entre sin sentido y verdaderamente agramatical.
Jerry Coffin
1
Para cualquiera que esté tan confundido como yo, coloque el operador sobrecargado fuera de la definición de su clase (como en el ejemplo).
umnikos
1
@Lorenzo: No, no puede ser una función de miembro. Consulte stackoverflow.com/a/9814453/179910 para obtener más detalles.
Jerry Coffin
22

Necesitas sobrecargar al <<operador,

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

Luego, cuando lo haga cout << x(donde xes de tipo myclassen su caso), generará lo que le haya dicho en el método. En el caso del ejemplo anterior, sería el x.somevaluemiembro.

Si el tipo del miembro no se puede agregar directamente a un ostream, entonces necesitaría sobrecargar el <<operador para ese tipo también, usando el mismo método que el anterior.

Rich Adams
fuente
4
Ese es el operador de turno a la izquierda, no el "operador de flujo". En el contexto de Iostreams, es el operador de inserción o extracción, pero nunca es el operador de flujo.
Billy ONeal
1
Lo siento, sí, tienes razón. Así es como lo he llamado en mi cabeza, ya que tiendo a usarlo solo cuando trato con transmisiones. En este caso, sería el operador de inserción como usted dice, en lugar de solo el operador de flujo. Actualicé mi respuesta para eliminar ese bit.
Rich Adams
14

es muy fácil, solo implemente:

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

Debe devolver una referencia al sistema operativo para encadenar la salida (cout << foo << 42 << endl)

Tristram Gräbener
fuente
-3

Alternativa:

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