C++ Cómo iterar a través de un std::vector de objetos y mostrar contenido en la consola

For loop debe iterar a través de std::vector y completar el contenido.

Primero for loop me da un mensaje de error que dice:

NO SE ENCONTRÓ OPERADOR BINARIO << No es posible convertir

vector<MyClass>classVector;
    for (vector<MyClass>::iterator i = classVector.begin();
                           i != classVector.end();
                           ++i)
            {
                cout << *i << endl;
            }

MiClase.h:

class MyClass{

private:

    string newTodayTaskString;

public:
    MyClass(string t) : newTodayTaskString (t){}

    ~MyClass(){}
};

Este ciclo for itera a través de un vector de cadenas y funciona perfectamente. ¿Por qué?

vector<string>stringVector;
   for (vector<string>::iterator i = stringVector.begin(); 
                         i != stringVector.end(); 
                         ++i) 
            {
                cout<<*i<<endl;
            }

preguntado el 04 de julio de 12 a las 09:07

5 Respuestas

La pregunta no está relacionada con la iteración, es solo porque puedes escribir

std::string s = "Hello";
std::cout << s;

pero no

MyClass o("Hello");
std::cout << o;      

Ver ¿Cómo sobrecargar correctamente el operador << para un ostream? sobre cómo sobrecargar operator << para que funcione!

contestado el 23 de mayo de 17 a las 13:05

Debe sobrecargar el operador de transmisión para su clase si desea poder llamar directamente std::cout::operator <<.

Puedes definirlo como:

 std::ostream& operator << (std::ostream& stream, const MyClass& obj)
 {
    stream << obj.newTodayTaskString;
 }

y declare este operador como amigo para que tenga acceso a los miembros privados de la clase o proporcione una función de impresión a su clase y utilícela en su lugar.

Respondido 04 Jul 12, 09:07

Creo que desea imprimir un miembro de la clase, no la clase en sí.

Por ejemplo:

cout << (*i).Name << endl; 

Respondido 04 Jul 12, 09:07

Correcto, perdón por la confusión. - usuario1010563

está iterando a través del vector de "MyClass", que es quizás un tipo definido por el usuario. Por lo tanto, debe decirle al compilador en qué datos de la clase "MyClass" está interesado. A continuación se muestra un código de muestra, solo para fines de comprensión.

// Temp_Practice.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
#include<memory>
#include<ostream>
#include <vector>>
using namespace std;

// This example is just for understanding/Demo purpose.
// it will not run on any compiler
class MyClass {
public:
    std::string _name;
    std::string _address;
    int         _age;
    // Constructor
public:
    MyClass() {}
    MyClass(std::string name, std::string address, int age) :_name(name), _address(address), _age(age) {}

    //Destructor
    //..

    // other stuff
    friend ostream& operator << (ostream& os, std::string _input);

};
 ostream& operator << (ostream& os, std::string _input)
{
     os << _input.c_str();
     return os;
}

int main()
{
    std::vector<MyClass> vecMyClass;

    MyClass temp("AA", "BB", 1);
    vecMyClass.push_back(temp);

    MyClass temp1("CC", "DD", 2);
    vecMyClass.push_back(temp1);

    MyClass temp2("EE", "FF", 3);
    vecMyClass.push_back(temp2);

    MyClass temp3("GG", "HH", 4);
    vecMyClass.push_back(temp3);

    MyClass temp4("II", "JJ", 5);
    vecMyClass.push_back(temp4);

    MyClass temp5("KK", "LL", 6);
    vecMyClass.push_back(temp5);
    std::vector<MyClass>::iterator itr;
    for ( itr = vecMyClass.begin(); itr != vecMyClass.end(); ++itr)
    {
        // Compiler throws error; it does not know what programer wants to print. So its 
        // programer responsiblity to let compiler know what to be printed
         //std::cout << itr << std::endl; //  Error!!!!

        // Correct Code
        std::cout << itr->_name << itr->_address << itr->_age << std::endl;
    }
    return 0;
}

Respondido el 27 de enero de 18 a las 04:01

Debe sobrecargar el operador de salida.

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

class MyClass{

private:
    std::string newTodayTaskString;

public:
    explicit MyClass(const std::string t) : newTodayTaskString (t){}
    std::ostream& print(std::ostream& os) const { return os << newTodayTaskString; }

    ~MyClass(){}
};

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

int main()
{
    std::vector<MyClass> vec = {MyClass("add"), MyClass("clear")};
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<MyClass>(std::cout, "\n"));
}

Respondido 04 Jul 12, 09:07

Gracias también por la solución. - usuario1010563

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.