[C con Clase] Problema con Constructor Copia

Steven Davidson srd4121 en njit.edu
Jue Nov 12 10:17:33 CET 2009


Hola John,

2009/11/11 John Loria <tanyin21 en hotmail.com>

> Saludos compañeros, anteriormente habia puesto una consulta sobre el
> constructor copia en una lista, bueno ahora resulta que me puse hacer una
> "cola", pero sigo con dudas.
> En el siguiente codigo, no entiendo porque me da problema, lo que trato de
> hacer es un constructor copia que reciba dos instancias de la clase cola y
> que me inserte un dato, entiendo que si uso el metodo "Insertar" dentro de
> ese constructor copia deberia de llenarme la instancia con el dato que estoy
> poniendo, lo compilo y cuando lo corro me da un error de "segment default".
> No entiendo que es lo que pasa, estoy usando el IDE Codeblocks y el
> compilador de g++, lo que trato de hacer es llenar una nueva instancia con
> los datos de dos instancias pasadas por parámetro por medio de un
> constructor copia.


En primer lugar, no se habla de un constructor copia a aquel constructor que
reciba más de un objeto de la misma clase. En tu caso, el constructor copia
se declara como:

Cola( const Cola &ref );

Esto no significa que no puedas crear un constructor 'Cola()' que acepte dos
objetos de la clase 'Cola', pero no recomiendo llamarlo "constructor copia".

Veamos el código que interesa.


>

#include <iostream>
>
> using namespace std;
>
> class Cola{
>
>    public:
>
>    Cola(){ultimo=NULL; primero=NULL; tamano=0;}
>
>    Cola(Cola& cuno,Cola& cdos){
>        for(int v=0;v<=cuno.Pilatamano()-1;v++){
>        Insertar(cuno.vector[v]);
>        }
>        for(int c=0;c<=cdos.Pilatamano()-1;c++){
>        Insertar(cdos.vector[c]);
>        }
>        }


Deberías indicar que las referencias son a objetos constantes, ya que no
tenemos ningún interés en modificar esas colas.

El error que tienes es que no inicializas ni asignas valores iniciales a los
datos miembro como las variables, 'ultimo', 'primero', y el contador del
tamaño actual. Esto lo hiciste para el constructor sin parámetros, pero no
para este constructor. Sin estos valores iniciales, la función 'Insertar()'
no se ejecutará correctamente porque hace uso de los punteros.


>    void Insertar(int v);
>    void Sacar();
>    void Mostrar();
>    int Pilatamano(){return tamano;}
>    bool Pilavacia(){return primero=NULL;}
>    int Primerdato(){return primero;}
>    int Ultimodato(){return ultimo;}
>
>    private:
>
>    int vector[6];
>    int primero;
>    int ultimo;
>    int tamano;
>
>    };
>
> void Cola::Insertar(int v){
>    if(Pilavacia()){
>        vector[Pilatamano()]=v;
>        ultimo=v;
>        } else {
>            vector[Pilatamano()]=v;
>            ultimo=v;
>            }
>        primero=vector[0];
>        tamano++;
>    }


Aquí tienes algunos problemas. En prrimer lugar, tal y como has implementado
esta función miembro, no tiene sentido que preguntes si la "pila" está vacía
o no, porque tanto si la está como si no, sigues exactamente los mismos
pasos:

vector[Pilatamano()]=v;
ultimo=v;

Deberías diseñar esta parte correctamente.

El otro problema es que no tienes en cuenta la cota superior, por lo que
permites insertar cualquier cantidad de valores sin consultar el tamaño
máximo de 'vector'. Esto implica que posiblemente te salgas fuera de los
límites del array, 'vector'. Por ello, se provoca un error de memora: fallo
de segmentación.

Espero que esto te ayude.
Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20091112/cc42b0de/attachment.html>


Más información sobre la lista de distribución Cconclase