Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: pitufocharly en 8 Julio 2014, 10:09 AM

Título: Ayuda tonta con el error que no veo en el constructor.
Publicado por: pitufocharly en 8 Julio 2014, 10:09 AM
Hola, el codigo me compila pero no se porque sale mal, creo que es algun fallo en el constructor pero no consigo verlo. Me podrian ayudar a solucionarlo, es un fallo muy tonto y si ple pero estoy empezando ahora en c++ y voy un poco perdido. Muchas gracias.

código:
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>

using namespace std;
class Clase{
private:
   int *V;
   int N;

public:
           Clase(int n){
       N=n;
       V=new int [N];
       for(int i=0;i<N;i++) V[i]=rand()%51;
       return;
   }
   ~Clase(){
       delete[]V;
       return;
   }
   void mostrar(void){
       for(int i=0;i<N;i++)cout<<V[i]<<"";
       cout<<endl;
       return;
   }
   Clase operator=(Clase m){
       delete[]V;
       N=m.N;
       V=new int[N];
       for(int i=0;i<N;i++)V[i]=m.V[i];
       return(*this);
   }
};
int main(void){
   Clase m1(10),m2(20);
   m1.mostrar();
   m2.mostrar();
   m2=m1;
   m1.mostrar();
   m2.mostrar();
   cin.get();
   return(0);

}

Título: Re: Ayuda tonta con el error que no veo en el constructor.
Publicado por: eferion en 8 Julio 2014, 10:29 AM
Nota inicial: Usa las etiquetas GeSHi para poner el código, gracias.

Código (cpp) [Seleccionar]

void mostrar(void){
        for(int i=0;i<N;i++)cout<<V<<"";
        cout<<endl;
        return;
    }


¿Pretendes imprimir "N" veces el vector "V"? me da la sensación de que te falta indicar el elemento a mostrar en cada iteración del for:

Código (cpp) [Seleccionar]

void mostrar(void){
        for(int i=0;i<N;i++)cout<<V[i]<<"";
        cout<<endl;
        return;
    }


PD.: por qué no usas la clase "vector" en vez de un arreglo? ¿si es por practicar o por exigencias del ejercicio vale, en caso contrario no merece la pena complicarse la vida.

Código (cpp) [Seleccionar]

#include <algorithm>
#include <vector>

class Clase
{
private:
  std::vector< int > elementos; // V no me dice absolutamente nada, mejor nombres descriptivos

public:
  Clase(int numElementos // n tampoco me dice nada)
  {
    for ( int i = 0; i < numElementos; ++i )
    {
      // has inicializado el generador de numeros aleatorios en algun sitio?
      elementos.push_back( rand( ) % 51 );
    }

    // return; <<-- No es necesario
  }

  ~Clase()
  {
    // delete[]V; <<-- Con la clase vector, esto ahora sobra
    // return; <<-- No es necesario
  }

  // En C++ no es necesario poner "void" cuando una funcion no tiene argumentos
  void mostrar( )
  {
    for_each( elementos.begin( ), elementos.end( ), [](int elemento){ cout<< elemento <<" "; } );
    cout<<endl;
    // return; <<-- No es necesario
  }

  // Es mejor que este operador devuelva una referencia, si no obligas a hacer una copia
  // adicional del objeto, con el coste en tiempo y recursos que conlleva.
  // Y lo mismo para el argumento de la funcion, es mejor pasar los "objetos" por referencia
  // que por valor.
  // El coste en este caso es muy bajo... pero es mejor adquirir buenas practicas desde el comienzo
  const Clase& operator=( const Clase& m )
  {
    elementos = m.elementos; // Y ya esta, no necesitamos nada mas
    return(*this);
  }
};


Por cierto, deberías revisar los comentarios que he puesto en el código.