UTNianos

Versión completa: [Info 2] duda con imprimir datos de un objeto
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola, bueno estoy intentando imprimir los datos privados de un objeto, pero tengo problemas, no logro hacerlo. Tengo el siguiente codigo:



class my_array
{
private:
int *p;
int tam;
int cant;
public:
void valores(void);
} //Solo pongo esto para no hacer la clase larga, valores me imprimiria los datos.

//Mi funcion para imprimir los datos:

void my_array::valores()
{
cout<<"Imprimo valores: ";
for(int i=0; cant <= i; i++)
{
cout<<p[i] << " ";
}
}

//El main:

int main(void)
{
my_array objeto(1,2,3); //Se inicia con valores 1,2y3 (p es puntero a int)

cout << "objeto " << objeto.valores();
return 0;

}



Deberia imprimir los numeros apuntados por p.... pero me tira el siguiente error cuando compilo:

C:\Clases qt\matias\my_array-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2008__Qt_SDK__Debug\..\my_array\main.cpp:113: error: C2679: '<<' binario : no se encontr¢ un operador que adopte un operando en la parte derecha de tipo 'void' (o bien no existe una conversi¢n aceptable)
Si no vi mal, definiste la propiedad p como un puntero a tipo int. El puntero guarda una direccion en memoria de la variable que apunta. Si vos haces cout<<p; estarias imprimiendo la direccion de p, lo que vos queres es el contenido de p. Seria cout<<*p; (agregas el * porque "p" es un puntero)... Proba con eso, es lo raro que vi en el codigo.

Saludos
Tenes un problema conceptual. El operador << es un operador sobrecargado que utiliza objetos ostream para ir concatenandolo hasta mandarlo a cout que es la salida estandar. Vos estas poniendo la funcion valores que retorna void y el << no sabe qué chota hacer con eso.

Tenes dos opciones, o te ahorras el manejo de ostream poniendo por separado:

cout << "objeto ";
objeto.valores();

O en la funcion valores vas metiendo todo en un objeto ostream declarado local en la funcion y terminas retornando eso. El prototipo de la funcion seria:

& ostream valores (void)
Fijate como tratas a esa propiedad "p" ya que es un puntero... ojo con los datos que quieras asignarles... no se como seras los set y get pero tene cuidado...
Hola, no, porque lo estoy imprimiendo como "vector", el mensaje de error me lo tira en la linea 28 donde esta esto: cout << "objeto " << objeto.valores();

igual probe hacer lo que dijiste por las dudas, pero me tira otro error mas jaja.
Perdon dije cualquier cosa, el problema es lo que te puso el otro compañero, porque la funcion te retorna void. Ponelo por separado, si el cout lo tenes en la funcion, no hace falta mandar otro cout... que el objeto llame al metodo y listo.

Disculpa,
Saludos!
jaja, geniaal! gracias, ahi entra a la funcion, pero no me imprime nada Confused no se que onda. Yo le agrego al objeto un valor asi:

objeto.add(10);
objeto.valores(); //Imprimo los valores (solo tendria el 10)

y esta es mi funcion add:



void my_array::add(int num)
{

p[cant] = num;
cant++;
}

Y no me imprime... solo me imprime "imprimiendo valores: "... y luego no pone mas nada (como si estuviera vacio)
Error numero 1:

for(int i=0; cant <= i; i++)

Acordate que la condicion es un 'mientras', no un 'hasta, tiene que ser i < cant (porque lo arrancaste con i=0)

Posible error numero 2:

Asumo que tenes un constructor metido por ahi que no lo mostraste. Estas inicializando cant a 0?

Error numero 3 (el ams grave)

En tu funcion add jamas estas dimensionando el puntero, tenes que usar new para asignarle memoria para agregarle un campo. Sino estas pisando zonas de memoria que no te pertenecen y podes hacer cualquier cosa.
mira, ahi le saque el = pero sigue haciendo lo mismo, el constructor ya me reserva una memoria minima, y luego cuando hago el add controla que la cantidad no se pase. Si, tambien inicio cant =0. Pego todo el codigo asi esta mas claro por las dudas:

Este es el .h:



class my_array
{
private:
int *p;
int tam;
int cant;
void xxx_arr(int);
public:
my_array(int);
my_array();
my_array(int[], int, int); //Tambien puedo int * en lugar de int[]
my_array(const my_array&);

void add(int);
void ptr() const;
int cantidad(void) const {return cant;};

my_array operator =(const my_array &);
const int& operator[](int);
void valores(void);

~my_array();
};

#endif // MY_ARRAY_H


Este es el .cpp:



#include "my_array.h"

using namespace std;

my_array::my_array(int t)
{
xxx_arr(t);
}
my_array::my_array()
{
xxx_arr(3);
}

my_array::my_array(int vec[], int a, int b) //Paso pos inicioal y pos final
{
int c = b-a;
xxx_arr(c);
for(int i=0; c <= i; i++)//En lugar de hacer esto puedo usar la funcion memcpy para copiar los datos.
{
p[i] = vec[a+i];
}
cant = c;
}

my_array::my_array(const my_array& copia)
{
tam = copia.tam;
cant = copia.cant;
memcpy(p,copia.p,tam*sizeof(int));
}

my_array my_array::operator =(const my_array &j)
{
if(this != &j) //Controlo que no se haga r1 = r1
{
delete []p;
cant = j.cant;
tam = j.tam;
memcpy(p,j.p,tam*sizeof(int));
return (*this);
}else
{
return (*this);
}
}

const int& my_array::operator [](int sub_indice)
{
return p[sub_indice];
}

void my_array::valores()
{
cout<<"\n\nImprimo valores: ";
for(int i=0; cant < i; i++)
{
cout<<p[i] << " ";
}
cout<<"\n\n";
}

void my_array::xxx_arr(int sz)
{
cant=0;
tam = sz;
p = new int[sz];
}

void my_array::add(int num)
{
if(cant < tam)
{
p[cant] = num;
cant++;
}else
{
cout << "Falta de tamaño.\n";
int *nuevo = new int[tam+10];
tam = tam + 10;
memcpy(nuevo,p,cant*sizeof(int));
nuevo[cant] = num;
delete(p);//borro lo que tengo para luego redirigir el puntero
p = nuevo;
cant++;
cout << "Agregada memoria al objeto.\n";
}
}

my_array::~my_array()
{
delete [] p;
}

int main(void)
{
my_array r1;
int vec[]={43,4,3,5,76,54,33,67,7};

my_array objeto(vec, 0, 2);
cout << "r1 cantidad: " << r1.cantidad() << "\n";

objeto.add(10);
objeto.valores();

cout << "r1 cantidad: " << r1.cantidad() << "\n";
cout << "obejto desde vec cantidad: " << objeto.cantidad() << "\n";

objeto.add(13);
cout << "obejto desde vec cantidad: " << objeto.cantidad() << "\n";


objeto = r1;
cout << "obejto igualado a r1 cant: " << objeto.cantidad() << "\n";

return 0;

}


Perdon si comento algun error groso, es uno de mis primeros codigos (hecho en clase a los pedos porque no nos dan muchio tiempo para hacerlos) y es mi primera vez trabajando con objetos y clases. Gracias por la buena onda =D
Suponiendo que esta bien la reserva de memoria, sigue estando mal ese for de impresion jaja, es i<cant, no cant< i
Geniaaal!! graciaas! ahi me imprime bien (r1 = se me muere en algun momento antes de que el codigo finalice, luego tengo que revisar eso, porque tampoco me la imprimia, pero ya puedo ver los valores. Graciaas!
No lei nada
Dos problemas veo

Falta el costructor de my_array

y estas sacando por cout lo que te devuelve la funcion, pero devuelve void.

Como la funcion ya saca por ceout lo que deberias hacer es llamarla de una, no llamarla dentro del cout.
Hacelo con while como te dice Abend. ¿Que te tira exactamente de error?

pd: ¿Por que no haces un constructor parametrizado de una?
(24-05-2013 15:13)brunodiaz escribió: [ -> ]No lei nada
Dos problemas veo

Falta el costructor de my_array

y estas sacando por cout lo que te devuelve la funcion, pero devuelve void.

Como la funcion ya saca por ceout lo que deberias hacer es llamarla de una, no llamarla dentro del cout.

ese es el problema, el doble cout
El problema estaba en el cout y en un for cuando imprimia. Ya esta solucionado, gracias por la ayuda =)
URLs de referencia