Hola John,<br><br>
<div class="gmail_quote">2009/11/11 John Loria <span dir="ltr"><<a href="mailto:tanyin21@hotmail.com">tanyin21@hotmail.com</a>></span><br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">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.<br>
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".<br>
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.</blockquote>

<div> </div>
<div>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:<br><br>Cola( const Cola &ref );</div>
<div> </div>
<div>Esto no significa que no puedas crear un constructor 'Cola()' que acepte dos objetos de la clase 'Cola', pero no recomiendo llamarlo "constructor copia".</div>
<div> </div>
<div>Veamos el código que interesa.</div>
<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote"> </blockquote>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">#include <iostream><br><br>using namespace std;<br><br>class Cola{<br><br>   public:<br><br>   Cola(){ultimo=NULL; primero=NULL; tamano=0;}<br>
<br>   Cola(Cola& cuno,Cola& cdos){<br>       for(int v=0;v<=cuno.Pilatamano()-1;v++){<br>       Insertar(cuno.vector[v]);<br>       }<br>       for(int c=0;c<=cdos.Pilatamano()-1;c++){<br>       Insertar(cdos.vector[c]);<br>
       }<br>       }</blockquote>
<div> </div>
<div>Deberías indicar que las referencias son a objetos constantes, ya que no tenemos ningún interés en modificar esas colas.</div>
<div> </div>
<div>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.</div>

<div> </div>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">   void Insertar(int v);<br>   void Sacar();<br>   void Mostrar();<br>   int Pilatamano(){return tamano;}<br>
   bool Pilavacia(){return primero=NULL;}<br>   int Primerdato(){return primero;}<br>   int Ultimodato(){return ultimo;}<br><br>   private:<br><br>   int vector[6];<br>   int primero;<br>   int ultimo;<br>   int tamano;<br>
<br>   };<br><br>void Cola::Insertar(int v){<br>   if(Pilavacia()){<br>       vector[Pilatamano()]=v;<br>       ultimo=v;<br>       } else {<br>           vector[Pilatamano()]=v;<br>           ultimo=v;<br>           }<br>
       primero=vector[0];<br>       tamano++;<br>   }</blockquote>
<div> </div>
<div>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:</div>

<div> </div>
<div>vector[Pilatamano()]=v;<br>ultimo=v;</div>
<div> </div>
<div>Deberías diseñar esta parte correctamente.</div>
<div> </div>
<div>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.<br>
</div>
<div> </div>
<div>Espero que esto te ayude.<br></div>
<div>Steven</div>
<div> </div></div>