Un saludo.
Estoy realizando una práctica de POO en C++. La temática (no entiendo por qué) es de algo de StarWars. La cosa es que una nave (StarFighter) está formada por una serie de piezas (un atributo en un array de punteros a piezas), como queda detallado en el fichero de cabeceras:
#ifndef STARFIGHTER_H
#define STARFIGHTER_H
#include <string>
#include <stdexcept>
#include "Pieza.h"
/**
* @brief
*/
class StarFighter
{
private:
static const int MAX_PIEZAS = 50;
static int _numStarFighters; ///< Número de objetos de esta clase instanciados
int _idSF=0; ///< Identificador único de la nave
std::string _marca; ///< Marca de la nave (parece que las VW contaminan más)
std::string _modelo; ///< Modelo de la nava
int _numPlazas = 1; ///< Número de plazas de la nave
int _numPiezas = 1; ///< Numero de piezas de la nave
Pieza *_piezas[MAX_PIEZAS]; ///<Array de piezas de la nave
public:
StarFighter ();
StarFighter ( std::string marca, std::string modelo, int numpiezas );
StarFighter ( const StarFighter& orig );
virtual ~StarFighter ( );
StarFighter& setNumPlazas ( int numPlazas );
int getNumPlazas ( ) const;
StarFighter& setModelo ( std::string modelo );
std::string getModelo ( ) const;
StarFighter& setMarca ( std::string marca );
std::string getMarca ( ) const;
int getIdSF ( ) const;
std::string toCSV () const;
StarFighter& operator= ( const StarFighter& otro );
void fromCSV ( std::string& datos );
void addPieza(std::string nombre, float peso, std::string descripcion);
void quitarPieza(int posicion);
};
#endif /* STARFIGHTER_H */
El problema viene en la destrucción de la nave. Al ser composición, es la nave la que se debe encargar de destruir los objetos de tipo pieza, pero no sé como tengo que implementar el destructor para que eso ocurra. Yo lo tengo ahora mismo así:
StarFighter::~StarFighter ( )
{
for (int i = 0; i < MAX_PIEZAS; i++){
this->_piezas[i] = nullptr;
}
}
Pero eso no llama nunca al destructor de la clase Pieza (lo he comprobado con el debugger), por lo que entiendo que se producirá goteo de memoria. He probado a cambiar el constructor y ponerlo como sigue:
StarFighter::~StarFighter ( )
{
for (int i = 0; i < MAX_PIEZAS; i++){
delete [] this->_piezas;
}
}
Lo cual me lleva a mis ya familiares "Segmentation Fault" (no entiendo por qué tampoco, pero bueno).
Antes de terminar, por si ha quedado en el aire, aclaro que el constructor crea piezas hasta el número que se le indique (por defecto 1):
StarFighter::StarFighter ( string marca, string modelo, int numpiezas ):
_marca (marca), _modelo(modelo), _numPiezas(numpiezas)
{
_numStarFighters++;
_idSF = _numStarFighters;
for (int i = 0; i < MAX_PIEZAS; i++){
_piezas[i] = nullptr; //Inicializamos todo el vector a nullptr
}
for (int i = 0; i < _numPiezas; i++){
_piezas[i] = new Pieza;
}
}
Agradezco cualquier sugerencia. Esta asignatura tiene tarea, y estar sin clases encima no ayuda.
Muchas gracias.