C/Visual C - Añadir a un TListBox el contenido de un fichero

 
Vista:

Añadir a un TListBox el contenido de un fichero

Publicado por Maria (2 intervenciones) el 12/01/2003 20:07:12
Tenemos un fichero de texto con información sobre unas obras de teatro. Antes de mostrar la información pasamos todo el contenido del fichero a un vector en la que cada posición es de tipo Obra, que es una clase creada por nosotras. Lo que queremos es mostrar el titulo de cada obra en un TListBox.
Hemos hecho el siguiente código:

for (int i= 0; i<(Obras.size()); i++)
ListaObras->Items->Add(Obras[i].getTitulo());

Al hacer esto compila pero nos saca tres rayas.

"Obras" es el nombre del vector y "getTitulo()" es una función que nos decuelve el nombre de la Obra.
Lo hemos intentado con iteradores pero nos da un error en el operador "<" y nos dice que nos está definido. Habíamos hecho la siguiente declaración:

vector<Obra<int> >::iterator it;
for(it=Obras.begin();it<Obras.end();it++)
.................................

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Uso correcto de iteradores en un vector de objetos para mostrar títulos en TListBox

Publicado por Alejandro (980 intervenciones) el 28/04/2025 17:57:03
Parece que estás enfrentando un problema con el uso de iteradores en tu código C++. Vamos a revisar el código y corregirlo para que funcione correctamente.

Problema identificado



El error que mencionas sobre el operador `<` no está definido se debe a que estás utilizando un iterador de un `std::vector` de una manera que no es compatible. En C++, los iteradores de `std::vector` no se comparan con el operador `<`, sino que se comparan con el operador `!=` para verificar si han alcanzado el final del vector.

Solución propuesta



Aquí tienes el código corregido utilizando iteradores:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <vector>
#include <iostream>
#include <string>
using namespace std;
 
// Supongamos que tienes una clase Obra definida así:
class Obra {
public:
    Obra(string titulo) : titulo(titulo) {}
    string getTitulo() const { return titulo; }
private:
    string titulo;
};
 
int main() {
    vector<Obra> Obras; // Asegúrate de que el vector sea de tipo Obra, no Obra<int>
    // Aquí deberías llenar el vector con objetos de tipo Obra
 
    // Usando iteradores para agregar títulos al TListBox
    vector<Obra>::iterator it;
    for (it = Obras.begin(); it != Obras.end(); ++it) {
        ListaObras->Items->Add(it->getTitulo()); // Usar 'it->' para acceder a los métodos
    }
 
    return 0;
}

Explicación de los cambios



1. Tipo de vector: Asegúrate de que el vector sea de tipo `vector<Obra>` y no `vector<Obra<int>>`. La clase `Obra` no debería tener un parámetro de plantilla a menos que sea necesario.

2. Uso de iteradores: En el bucle `for`, se utiliza `it != Obras.end()` para verificar el final del vector. Esto es lo correcto para iteradores.

3. Acceso a métodos: Para acceder al método `getTitulo()` de la clase `Obra`, debes usar `it->getTitulo()` en lugar de `Obras[i].getTitulo()`.

Conclusión



Con estos cambios, tu código debería compilar y funcionar correctamente, mostrando los títulos de las obras en el `TListBox`. Si sigues teniendo problemas, asegúrate de que la clase `Obra` esté correctamente definida y que el vector `Obras` esté correctamente poblado con instancias de `Obra`. ¡Buena suerte, María!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar