Eso era justo lo que queria hacer, un vector de punteros pero lo puse mal y no me daba cuenta; gracias.<br><br>Una cosa mas, hay algo como el realloc en C++? Porque la talla del vector me gustaria que fuera dinamica.<br><br>
Gracias<br><br><div class="gmail_quote">2009/3/31 Steven Davidson <span dir="ltr"><<a href="mailto:srd4121@njit.edu">srd4121@njit.edu</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hola Vicente,<div class="im"><br>
<br>
vicente lozano wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hola,<br>
<br>
He declarado un constructor copia, pero al hacer la asignacion de un<br>
new me da un error el compilador que no entiendo.<br>
<br>
</blockquote>
<br></div>
Ten presente que una asignación no implica un constructor copia. Por ejemplo,<br>
<br>
class Algo<br>
{<br>
public:<br>
  Algo();<br>
  Algo( const Algo &ref );<br>
  ...<br>
};<br>
<br>
int main()<br>
{<br>
  Algo obj1, obj2;  // Constructor: Algo()<br>
  Algo obj3 = obj1;  // Constructor copia: Algo(const Algo &)<br>
<br>
  obj2 = obj1;  // Asignación<br>
  ...<br>
}<br>
<br>
Las asignaciones tienen que ver con el operador de asignación y no con el constructor. Si queremos un comportamiento diferente al de defecto para la asignación, entonces tenemos que sobrecargar el operador de asignación.<div class="im">
<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Las clases son:<br>
<br>
class ProbabilityDistribution {<br>
<br>
gsl_rng * _rnd;<br>
DistType _distType;<br>
long double _mu;<br>
long double _sigma;<br>
...<br>
}<br>
<br>
class Error {<br>
ProbabilityDistribution _components[];<br>
</blockquote>
<br></div>
Me temo que esta declaración no es correcta. O bien creaste un array o bien un puntero; esto es,<br>
<br>
class Error<br>
{<br>
  ProbabilityDistribution _components[1024];<br>
  ...<br>
};<br>
<br>
Usando un puntero, entonces sería:<br>
<br>
class Error<br>
{<br>
  ProbabilityDistribution *_components;<br>
  ...<br>
};<br>
<br>
<br>
Si has declarado este miembro como un array, entonces tienes un error y posiblemente otro. Escribes:<br>
<br>
_components[0] = new ProbabilityDistribution( ... );<br>
<br>
Los tipos no concuerdan; estás haciendo esto,<br>
<br>
<ProbabilityDistribution> = <ProbabilityDistribution *><br>
<br>
Es decir, intentas asignar un puntero a un objeto. Como no has sobrecargado el operador de asignación, el compilador se queja de que no existe un candidato para este operador con los tipos de estos operandos.<br>
<br>
Ten presente que al usar un array, ya has instanciado todos los objetos según la cantidad del array. Siguiendo el ejemplo que he dado, hemos instanciado 1024 objetos de la clase 'ProbabilityDistribution' invocando el constructor 'ProbabilityDistribution()' - sin parámetros.<br>

<br>
Si en su lugar, '_components' es un puntero, entonces, no tendríamos un problema, ya que los tipos de los operandos en la asignación concuerdan; esto es,<br>
<br>
<ProbabilityDistribution *> = <ProbabilityDistribution *><br>
<br>
Sin embargo, apuntaríamos a un solo objeto, sin tener una lista de objetos.<br>
<br>
Aconsejo crear un array dinámico de punteros a 'ProbabilityDistribution'. Esto es,<br>
<br>
class Error<br>
{<br>
  ProbabilityDistribution **_components;<br>
  ...<br>
};<br>
<br>
Luego, haríamos esto:<br>
<br>
// Creamos el array dinámicamente<br>
_components = new ProbabilityDistribution*[1024];<br>
<br>
// Instanciamos un objeto para el primer elemento<br>
_components[0] = new ProbabilityDistribution( ... );<br>
<br>
Esto implica que tenemos que liberar la memoria, posiblemente para el destructor.<br>
<br>
La otra posibilidad es declarar un array (estático) de punteros. Esto sería,<br>
<br>
class Error<br>
{<br>
  ProbabilityDistribution *_components[1024];<br>
  ...<br>
};<br>
<br>
Con esto, creamos un array de punteros y luego instanciaremos cada objeto de cada elemento dinámicamente, según nos interese. Esto es,<br>
<br>
_components[0] = new ProbabilityDistribution( ... );<br>
<br>
<br>
En C++, aconsejaría usar una clase-plantilla estándar que realice estas operaciones. Por ejemplo, podrías usar un 'vector<>' que viene a representar un array cualquiera. Por ejemplo,<br>
<br>
#include <vector><br>
<br>
class Error<br>
{<br>
  vector< ProbabilityDistribution > _components;<br>
  ...<br>
};<br>
<br>
También podrías crear un 'vector' de punteros. Esto es,<br>
<br>
class Error<br>
{<br>
  vector< ProbabilityDistribution * > _components;<br>
  ...<br>
};<br>
<br>
Así, puedes instanciar cada objeto dinámicamente.<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
int _ncomponents;<br>
long double _lastError;<br>
...<br>
}<br>
<br>
<br>
Se usa la libreria GSL, libreria matematica que me recomendasteis por<br>
aqui, pero el error creo que no tiene nada que ver, lo digo solo<br>
para que sepais de donde viene el gsl_rng y tal.<br>
<br>
</blockquote>
<br></div>
No veo error en la GSL, pero sí veo un problema con 'gsl_rng *' en la clase 'ProbabilityDistribution'. Siempre que diseñes una clase que contenga miembros que son punteros, deberías definir un constructor copia y sobrecargar el operador de asignación. De lo contrario, estarás copiando punteros y no la información apuntada por ello. Esto se llama una copia de poca o baja profundidad. Lo que interesa es hacer una copia profunda, siguiendo los punteros y copiando toda la información.<br>

<br>
<br>
Espero haber aclarado las dudas.<br>
<br>
Steven<br>
<br>
<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net" target="_blank">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br>
</blockquote></div><br>