es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿La clase ostream tiene un operador <

Actualmente estoy tratando de aprender la sobrecarga de operadores y tengo un pequeño ejemplo que estoy tratando de entender.

#pragma once

class Vector2
{
    public:
        int u, v;

    Vector2(int u, int v): u(u), v(v){ };
};

y

#include "Vector2.h"

#include <iostream>

std::ostream& operator<<(std::ostream& stream, const Vector2& other) {
    stream << other.u << ", " << other.v;
    return stream;
}

int main() {
    std::cout << Vector2(10, 20);
    return 0;
}

Mi primera pregunta aquí es, al utilizar operator<< esta es una función global que estamos definiendo para ser llamada cuando se proporcionan los dos tipos de parámetros, en este ejemplo std::ostream y Vector2, por lo que puedo interpretar esto como: “Cuando se le proporciona un std::ostream a la izquierda de << y Vector2 a la derecha, llame a esta función”. Sin embargo, esto en sí mismo no imprime en la salida estándar. Cuando se le proporcionan los objetos, aún necesitamos llamar a stream << other.u. Esto significa que la clase ostream debería tener un operator<< en algún lugar. Sin embargo, en mi entorno de desarrollo integrado (IDE), intento seguirlo y encuentro la definición using ostream = basic_ostream<char, char_traits<char>>;. En mi nivel actual de C++, no sé a dónde seguir esto, pero mi instinto me dice que en algún lugar debería haber una clase llamada ostream que tenga implementado operator<<. ¿Es esto correcto?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, estás en lo correcto en tu interpretación. En este ejemplo, operator<< es una función global que se está definiendo para ser llamada cuando se le provee un objeto std::ostream a la izquierda de << y un objeto Vector2 a la derecha. Sin embargo, esto no imprime nada en la salida estándar por sí mismo.

    Para lograr la salida deseada, la función operator<< se utiliza en la función main con std::cout << Vector2(10, 20);. Esta instrucción primero crea un objeto Vector2 con valores 10 y 20, y luego utiliza std::cout como el operando izquierdo de << y el objeto Vector2 como el operando derecho.

    La definición de std::ostream en realidad es un typedef que se refiere a la plantilla de clase basic_ostream. Esta plantilla toma dos parámetros de plantilla: char y char_traits<char>. La clase std::ostream en sí misma es una especialización de esta plantilla, por eso ves el typedef en tu IDE.

    Tienes razón en que la clase std::ostream proporciona una implementación de operator<< que recibe varios tipos como argumentos. Estas funciones de implementación están definidas en los archivos de encabezado de la biblioteca estándar de C++, a los cuales tu IDE debería tener acceso.

Comments are closed.