Ayuda c++ - Problema con constructores..

Riu

vamos a ver...

spoiler

1º¿Como puedo arreglar el if que me comprueba si ahi algo en la variable de tipo cadena llamada ruta.?
2º¿como funciona el constructor, realmente es como los metodos de la clase que le mandas un valor en este caso fich, y carga el fichero?
3º¿En que falla, si en la declaracion del constructor pongo el nombre del fichero me lo carga, pero al pasarselo mediante la opcion 4 del menu, no funciona, aunque el valor que le pasa es el mismo?

maRc

1- Las cadenas de tipo c (como un vector de char) no las puedes comparar con ==, tienes que usar strcmp.
2- El constructor es el método que se llama al crear el objeto. Luego no se puede usar en ningún otro lado.
3- Di exactamente que es lo que falla, porque en principio parece correcto. Ten en cuenta que ahí estás declarando el objeto gp, pero luego en la siguiente iteración del while lo eliminas.

Riu

#2 mmmm strcmp(cadena1,cadena2), yo lo que intento hacer es ver si la variable fich esta vacia no compararla con ninguna otra, pero supongo que esa es la unica forma de hacerlo, podrias poner el codigo por que aunque lo entiendo no se muy bien ahora como hacerlo.
El constructor, me deberia cargar el fichero pero en lugar de eso solo me mete basura, en cambio si inicializo la variable fich del constructor si que me lo carga correctamente.. , estoy sumamente rayado con esto, mi profesor no contesta a los correos y con los apuntes no lo veo nada claro...

maRc

Para ver si está vacía, mira si el primer caracter es el valor nulo con "cadena[0] == 0".

Te repito que el constructor parece correcto. ¿Le pasas bien el nombre del fichero?

bLaKnI

No me he mirado mucho el codigo, pero ya que trabajas con C++, porque no usar la ventaja que te da STL?

Usa strings hombre...!

NOTA: recuerda que en strings, tienes un metodo ".c_str()", que te devuelve el string en modo char array, para cualquier funcion que lo requeriera particularmente.

Riu

#4 no me dejan ;s tengo ke hacerlo con typedef char cadena[50]... pero gracias de todas formas..

bLaKnI

Por cierto, veo esto:

public:

x(cadena fich=""); // constructor de la Clase X

cuando haces la declaracion del constructor de la classe X.
Estas seguro de que esto está bien?
En la declaracion no debes pasarle parametros que se inicializan, i en caso de así quererlo, debes hacerlo así:

x(...){
inicializa aqui lo que quieras.
}

o bien:

x(...):var(valor var);

Creo que es lo que puedes tener mal.
Seria interesante que pegaras los errores que te salen, pues generalmente te dicen que pasa y donde pasa.

GaN2

A ver si puedo ayudar, hace muuucho que no toco c++ pero a ver si se algo todavia xD:

  • if (ruta != null). Prueba con ese if, aunque no se si funcionara.

  • El constructor x creo que lo tienes mal como ha dicho el compañero de arriba. Para llamar al constructor de una clase seria algo como Miclase obj(fich), pero lo has declarado mal el constructor, ponlo como x(cadena fich), y luego cuando definas el metodo, pones strcpy(ruta,fich); (o haces lo que quieras). Otra cosa, ruta no está definido en la declaración de la clase, y creo que lo utilizas bastante, asi que declaralo.

  • Cambiale el nombre a la clase x, y ponle otro nombre que sea explicativo. Haz eso con las demás clases, metodos y demás que tengas, porque te va a simplificar mucho el entender un programa y tu profesor no te va a quitar puntos si lo haces asi. Yo tenia un profesor que si veia un nombre no explicativo como nombre de clase o como elemento de formulario te quitaba puntos.

Lo siento si hay algo que este mal (que lo habrá), hace como unos 2-3 años que no toco c++ y tampoco es que recuerde mucho xDDD

Riu

#8 null no funciona, eso para otros lenguajes quizas si, pero en c++ no funciona ojala, despues lo de inicializar el constructor

class GranPremio
{						//Los atributos son los mismos
      cadena Nombre;
      cadena Pais;
      TFecha Fecha;
      int NVueltas;
      piloto DatosPilotos[N_MAX_PILOTOS];
      int NPilotos;
      TTiempo DatosClasificacion[N_MAX_PILOTOS];

   public:
      GranPremio(cadena fich="");                        
void CrearParrilla(int npilotos =' '); //modificado. void MostrarPilotos(int i); //modificado. void ModificarPilotos(int Posicion); //modificado void Clasificacion(int i=0); //modificado int cuantos (); //nuevo. };

en la declaracion de la clase en la parte publica, declaro el constructor, y lo pongo con "vacio".

        GranPremio::GranPremio(cadena fich){

     cadena ruta;
     strcpy(ruta,fich);
     int fin;
    if(fich!="1"){
    cout<<ruta;
    FILE *fin;
    fin=fopen(ruta,"rb");
    if (fin!=NULL)
    fread(this,sizeof(GranPremio),1,fin);
    fclose(fin);
    }

    //Inicializamos las Posiciones y los tiempos de los Pilotos a 0.
    for(int i=0;i<N_MAX_PILOTOS;i++){
    DatosClasificacion[i].piloto=0;
            for(int x=0;x<3;x++){
                    DatosClasificacion[i].sectores[x]=0;
            }
                    DatosClasificacion[i].minuto=0;
                    DatosClasificacion[i].segundos=0;
                    DatosClasificacion[i].milesimas=0;
                    DatosClasificacion[i].Total=0;
    }
}

despues cuando digo lo que hace el constructor le digo si ruta!="vacio"
entonces entro dentro del bucle y cargo el fichero, sino no nada y inicializo todo los tiempos de los pilotos a 0.
no veo como inicializarlo si lo que yo quiero es que cuando le pase un nombre de fichero me lo carge... y si paso la variable al constructor como hago en el main , me pasa el valor de la variable pero no me carga el fichero en la clase.. , no se ni lo que digo estoy rayao xdd

Puni

no se muy bien q pretendes con

x(cadena fich=""); // constructor de la Clase X

pero eso no inicializa nada, eso es un parametro por omision, es decir, si te llaman al constructor sin pasar ningun parametro el parametro fich valdra ""

Riu

#10 yo no queria inicializarlo en la declaracion del constructor, lo que pretendia es lo que tu has dicho, si no se le pasa ningun valor, fich="", osea que no carge ningun fichero... para eso necesito el if(ruta!="") me carge el fichero. pero el problema es a la hora de pasarle el nombre o no se muy bien que, por que el nombre si me lo pasa bien pero no me carga bien la clase, mirame Declaro en el main en la opcion 5 el constructor y lo llamo gp y ahi le meto el nombre del fichero, pero a la hora de verlo no hace nada..., ;s

Puni

ahm, entonces simplemente es q estas comparando ruta con != y lo has definido como char[], tendras q compararlo con strcmp(ruta,""), de todas formas al profesor q no os deja usar strings de mi parte llamale puerco por lo menos xD

o eso, o pasa de los typedef, q al llamarlo cadena induce a error pensando q puedes compararlo como un string

Riu

#12 gracias por lo del if taba rayao con eso ;s, u_U nose tengo 4 profesores en programacion 2 para teoria y 2 para practicas -_- :o..

22 días después
Riu

JUM!, sigo sin hacerlo bien jeejej
ES a la hora de pasarle el nombre del fichero en el main no me carga los datos en la clase, puta mierda que no entiendo que hago mal que impotencia joder.

dagavi

Te lo levanto para que se vea más.

maRc

Sube todo el código, a ver si se puede sacar algo.

r2d2rigo

Y no metas aqui el tochote, www.pastebin.com es tu amigo.

maRc

Hombre, metiendolo dentro de un code y en spoiler tampoco pasa nada.

JuAn4k4

public:

x(cadena fich); // constructor de la Clase X

};

x::x(cadena fich){

#

cadena ruta;

strcpy(ruta,fich);

int fin;

// este if no me funciona, ruta siempre tiene basura en su conteido

if(ruta[0] != '\0'){

cout<<ruta;

FILE *fin;

fin=fopen(ruta,"rb");

if (fin!=NULL)

fread(this,sizeof(GranPremio),1,fin);

fclose(fin);

}

Dejalo asi a ver si funciona, ya compruebas con fopen que el fichero exista, si te pasan una cadena vacia pues nada, incluso puedes poner:
if ( strlen(ruta) > 0 ) ) que queda de mas alto nivel. xD

Pero quita la declaracion rara esa

x::x(cadena fich=""){

realmente no se muy bien lo que haria esto

Riu

el if lo hize con strcmp(fich,"")
despues el constructor donde x::x(fich=""); , es por un parametro por defecto, osea si no le pasas ningun valor a fich este sera nulo o vacio.
gracias por responder, el codigo esta en el spoiler...

JuAn4k4

#20

"" no es nulo eh. Es un puntero a una cadena vacia.
Sin embargo lo que hace es cambiar a donde apunta fich.

Si es un typedef char fich[n]; fich no puede cambiarse, por lo que no puedes asignarle ""

lo que tienes es un puntero de valor constante, lo que cambias es el contenido.

si fuera typedef char* fich; entonces si podrias hacer eso.

Riu

#17 gracias por la web utilisma ;> http://pastebin.com/m11a29eb3 aqui esta el link.., aver si podeis ayudarme a entenderlo, por que yo creo que esta bien hecho pero no funciona..

Riu

#21 tienes razon me exprese mal... xdd

Usuarios habituales

  • Riu
  • JuAn4k4
  • maRc
  • dagavi
  • Puni
  • GaN2
  • bLaKnI