Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas con constructores

Iniciado por PIM, 09 de Junio de 2013, 06:54:42 AM

« anterior - próximo »

PIM

Hola de nuevo amigos de esta estupenda web. Estoy haciendo mis primero pininos con C++ y tengo un problema que ojalá me puedan resolver.

Este es el código de mi cabecera.


#ifndef PRUEBA_H
#define PRUEBA_H

#include <iostream>
#include <cstring>

using namespace std;

class cadena{
  public:
   cadena();
   cadena(const char *c);
   cadena(int n);
   cadena(const cadena &Cad);
   ~cadena();
   void DevDir();
   void Asignar(const char *dest);
   char *Leer(char *c);
  private:
    char *cad;
    short valor;
    friend void tec(cadena obj);
};

#endif


Este el de mi archivo .cpp

#include "prueba.h"

cadena::cadena():cad(NULL),valor(128){}

cadena::cadena(const char *c){
  cad = new char[strlen(c)+1];
  strcpy(cad,c);
}

cadena::cadena(int n){
  cad = new char[n+1];
  cad[0] = 0;
}

cadena::cadena(const cadena &Cad){
  cad = new char[strlen(Cad.cad)+1];
  strcpy(cad,Cad.cad);
}

cadena::~cadena(){
  delete[] cad;
}

void cadena::DevDir(){
  cout << "dir valor: " << &cad << endl;
}

void cadena::Asignar(const char *dest){
  delete[] cad;
  cad = new char[strlen(dest)+1];
  strcpy(cad,dest);
}

char *cadena::Leer(char *c){
  strcpy(c,cad);
  return c;
}

void tec(cadena obj){
  cout << obj.valor << endl;
}


Y este el de main.

#include "prueba.h"

int main(){
    cadena Cadena1;

    tec(Cadena1);

    cin.get();
    return 0;
}


El problema es que lo compila bien, pero al ejecutarlo me manda un error como cuando hay una violación de acceso de memoria.

Uso Code::blocks y usando el debugger me indica que los errores están según en:

1. main, en la función tec(Cadena1).
2. en el archivo .cpp, en el constructor copia

El caso es que quitando la llamada a la función friend se quita el error, ya no hay errores.

Lo curioso es que incluso basta con solo llamar a la función tec(Cadena1) [aunque esté vacía] para que el error regrese. ¿Alguien me podría decir cuál es el error?

De antemano muchas gracias.
;)

Gallo

#1
En el constructor normal (sin parámetros) estas inicializando cad a NULL y luego en el de copia, intentas hacer strlen de un NULL lo que probablemente te está dando el error, el strcpy también te daria un error similar.

De paso, la función tec, salvo que realmente quieras una copia del objeto, yo la declararia como

friend void tec(const cadena &Cad)

de esta manera estas viendo / manipulando los valores del objeto del main y no de una copia local que solo existe dentro de la función además de que está mas optimizado ya que te ahorras llamar al constructor de copia, lo cual evita el error que da ahora, pero aún así es importante que entiendas lo del NULL.

Ya como consejo, se que el tema de los nombres de las cosas va a gustos, pero yo a las clases siempre les pongo la primera letra en mayúscula y a los métodos en minúscula, poniendo en mayúscula la primera letra de las siguientes "palabra", es lo que se llama camelCase: http://es.wikipedia.org/wiki/CamelCase , Upper para clases, lower para lo demás.

Saludos.

PIM

Muchas, muchas gracias amigo, mi problema está resuelto gracias a tu ayuda.

¡Ahora ya funciona!

Saludos y de nuevo gracias.
:)







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.