jaja, que va, se me da muy mal eso de los discursos, si me he tirado una hora para escribir eso sobre la marcha, gracias!
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCita de: amchacon en 15 Julio 2013, 16:34 PM
Los mensajes del destructor no vienen del push_back sino de los delete que has puesto.
Citar
Ha nacido Juan.
Ha nacido Lucas.
Ha nacido Antonio.
---
Juan ha sido adoptado. (push_back(c1))
---
Lucas ha sido adoptado. (push_back(c2))
Ha muerto Juan. (c1 muere por push_back(c2))
---
Antonio ha sido adoptado. (push_back(c3))
Ha muerto Juan. (c1 muere por push_back(c3))
Ha muerto Lucas. (c2 muere por push_back(c3))
---
Hijo #0: Juan
Hijo #1: Lucas
Hijo #2: Antonio
Ha muerto Lucas. (Muerte por delete)
Ha muerto Antonio. (Muerte por delete)
Hijo #0: Juan
Hijo #1: Lucas
Hijo #2: Antonio
---
Ha muerto Juan.
Ha muerto Lucas.
Ha muerto Antonio.
#include <iostream>
#include <vector>
using namespace std;
class Father;
class Child
{
string name;
Father *p;
public:
Child(string);
~Child();
string getName();
void assignFather(Father *);
};
class Father
{
vector<Child*> children;
public:
void addChild(Child *);
void removeChild(Child *);
void showNames();
};
#include "class.hpp"
Child::Child(string n) : name(n)
{
cout << "Ha nacido " << name << "." << endl;
}
Child::~Child()
{
cout << "Ha muerto " << name << "." << endl;
p->removeChild(this);
}
string Child::getName()
{
return name;
}
void Child::assignFather(Father *p)
{
this->p = p;
}
void Father::addChild(Child *c)
{
c->assignFather(this);
children.push_back(c);
cout << c->getName() << " ha sido adoptado." << endl;
}
void Father::removeChild(Child *c)
{
for(unsigned int i=0; i<children.size(); i++)
{
if(c==children.at(i))
{
children.erase(children.begin()+i);
cout << "Hijo #" << i << " (" << c->getName() << ") ha muerto." << endl;
break;
}
}
}
void Father::showNames()
{
cout << "---" << endl
<< "Numero de hijos: " << children.size() << endl;
for(unsigned int i=0; i<children.size(); i++)
{
cout << "Hijo #" << i << ": " << children.at(i)->getName() << endl;
}
cout << "---" << endl;
}
#include "class.hpp"
int main()
{
Child *c1, *c2, *c3;
c1 = new Child("Juan");
c2 = new Child("Lucas");
c3 = new Child("Antonio");
Father f1;
f1.addChild(c1);
f1.addChild(c2);
f1.addChild(c3);
f1.showNames();
delete c2;
f1.showNames();
return 0;
}
CitarHa nacido Juan.
Ha nacido Lucas.
Ha nacido Antonio.
Juan ha sido adoptado.
Lucas ha sido adoptado.
Antonio ha sido adoptado.
---
Numero de hijos: 3
Hijo #0: Juan
Hijo #1: Lucas
Hijo #2: Antonio
---
Ha muerto Lucas.
Hijo #1 (Lucas) ha muerto.
---
Numero de hijos: 2
Hijo #0: Juan
Hijo #1: Antonio
---
Cita de: amchacon en 15 Julio 2013, 16:04 PMEl problema esque estás creando copiando los objetos cada vez que haces push_back, por eso al hacer esto:delete c2;
delete c3;
No tiene ningún efecto, tienes que usar punteros para apuntar a estos objetos:vector<Child*> children;
Cita de: X3R4CK3R en 15 Julio 2013, 15:16 PMMientras creaba este post, me he dado cuenta de que estaba haciendo un vector de Hijos (vector<Child>), cuando lo que quería hacer es un vector de punteros a clases Hijos (vector<Child*>).Sí, lo sé, fue solo un descuido, ya corregí el código antes de postearlo, pero no consideré conveniente postear el código actualizado, ya que la duda que me ha surgido ocurre cuando los elementos no son punteros, todos los elementos (no punteros) se destruyen automáticamente al llegar al final del bracket '}' donde se encuentra declarado, pero ¿por qué al hacer un push_back, el resto de elementos que ya estaban en el vector son destruídos? o al menos, la función destructor es ejecutada. No lo entiendo. :/
Cita de: 0xDani en 15 Julio 2013, 15:53 PM
Claro, lo ideal es que tengas un vector de punteros a los hijos.
En cuanto a esto:
Lo que puedes hacer es que, al incluir un hijo en la lista, el padre notifique al hijo de que ha sido adoptado, y este guarde la dirección de su padre. Luego, al ser destruido el hijo, que llame a una funcion removeChild() (que habrás de implementar, y que eliminará a un hijo de la lista) con su propia dirección.
CitarThis effectively increases the container size by one, which causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity.
#include <iostream>
#include <vector>
using namespace std;
class Child
{
string name;
public:
Child(string);
~Child();
string getName();
};
class Father
{
vector<Child> children;
public:
void addChild(Child*);
void showNames();
};
#include "class.hpp"
Child::Child(string n) : name(n)
{
cout << "Ha nacido " << name << "." << endl;
}
Child::~Child()
{
cout << "Ha muerto " << name << "." << endl;
}
string Child::getName()
{
return name;
}
void Father::addChild(Child *c)
{
cout << c->getName() << " ha sido adoptado." << endl;
children.push_back(*c);
}
void Father::showNames()
{
for(unsigned int i=0; i<children.size(); i++)
{
cout << "Hijo #" << i << ": " << children.at(i).getName() << endl;
}
}
#include "class.hpp"
int main(int argc, char *argv[])
{
Child *c1, *c2, *c3;
c1 = new Child("Juan");
c2 = new Child("Lucas");
c3 = new Child("Antonio");
Father f1;
cout << "---" << endl;
f1.addChild(c1);
cout << "---" << endl;
f1.addChild(c2);
cout << "---" << endl;
f1.addChild(c3);
cout << "---" << endl;
f1.showNames();
delete c2;
delete c3;
f1.showNames();
cout << "---" << endl;
return 0;
}
CitarHa nacido Juan.
Ha nacido Lucas.
Ha nacido Antonio.
---
Juan ha sido adoptado.
---
Lucas ha sido adoptado.
Ha muerto Juan.
---
Antonio ha sido adoptado.
Ha muerto Juan.
Ha muerto Lucas.
---
Hijo #0: Juan
Hijo #1: Lucas
Hijo #2: Antonio
Ha muerto Lucas.
Ha muerto Antonio.
Hijo #0: Juan
Hijo #1: Lucas
Hijo #2: Antonio
---
Ha muerto Juan.
Ha muerto Lucas.
Ha muerto Antonio.
Cita de: Caster en 13 Julio 2013, 23:31 PM
libgcc_s_dw2-1.dll y mingwm10.dll.
Saludos
Cita de: Caster en 13 Julio 2013, 21:41 PM
A mi me sigue dando error de que faltan las dos líbrerías pero ya se abre una consola para el server.
Saludos
Cita de: OmarHack en 13 Julio 2013, 18:45 PM
No es por mal pero eso es injusto para el resto de aplicaciones restantes. Yo sin modificar el código nada de nada puedo añadirle las funcionalidades que quiera. Se que no es tu caso, pero muchos nos pasamos 2 o 3 días creando temas para que nos ayudaran a testear la aplicación, crear máquina virtuales etc para que el programa funcionara sin problemas.
Quitando eso enhorabuena por el programa es muy bueno, yo también estoy haciendo un cifrado para el mio.
Un saludo.