La práctica consiste en hacer una especie de programa de listas recordatorio, como Google Keep, utilizando memoria dinámica.
Pues bien, ahora mismo tal y como lo tengo al crear dos listas seguidas no da ningún fallo, pero si quiero crear una lista habiendo creado items dentro de cualquier lista, el programa me crashea.
Por ejemplo:
1. Comprar
2. Estudiar
No falla
1. Comprar
1. Queso
2. Estudiar
Falla al crear la lista Estudiar.
Aunque el resto de programa ya implementado en el código principal, el error se sitúa aquí, ya no sé que hacer, seguro que es una tontería, pero no la encuentro:
Código
#include <iostream> #include <windows.h> using namespace std; class Item{ private: string Nombre; bool Estado; public: Item(){ Nombre = ""; Estado = true; return; } Item(const Item &original){ Nombre = original.Nombre; Estado = original.Estado; return; } void NuevoItem(string nomItem){ Nombre = nomItem; Estado = false; return; } void MostrarItem(){ cout << Nombre << endl; } void operator =(Item origen){ Nombre = origen.Nombre; Estado = origen.Estado; return; } }; class Lista{ private: string Nombre; Item *vItems; int nItems; public: Lista(){ Nombre = ""; vItems = NULL; nItems = 0; return; } Lista(const Lista &original){ Nombre = original.Nombre; nItems = original.nItems; for(int i=0;i<nItems;i++)vItems[i] = original.vItems[i]; return; } void CrearLista(string nomLista){ Nombre = nomLista; return; } void mostrarLista(){ cout << Nombre << endl; for(int i=0; i<nItems; i++){ cout << "\t" << i+1; vItems[i].MostrarItem(); } return; } void operator =(Lista origen){ Nombre = origen.Nombre; nItems = origen.nItems; for(int i=0;i<nItems;i++)vItems[i] = origen.vItems[i]; return; } void crearItem(){ string nomItem; cout << "Especifique el nombre del item a crear: "; cin >> nomItem; Item *aux = new Item[nItems+2]; for(int i=0; i<nItems; i++) aux[i] = vItems[i]; delete []vItems; vItems = aux; aux = NULL; vItems[nItems].NuevoItem(nomItem); nItems++; return; } }; class ToDo{ private: Lista *vListas; int nListas; public: ToDo(){ vListas = NULL; nListas = 0; return; } ToDo(const ToDo &original){ nListas = original.nListas; for(int i=0; i<nListas; i++) vListas[i] = original.vListas[i]; return; } void CrearLista(){ string nomLista; cout << "Especifique el nombre de la lista a crear: "; cin >> nomLista; Lista *aux = new Lista[nListas+2]; for(int i=0; i<nListas; i++)aux[i] = vListas[i]; delete []vListas; vListas=aux; aux=NULL; vListas[nListas].CrearLista(nomLista); nListas++; return; } void MostrarListas(){ for(int i=0; i<nListas; i++){ cout << i+1 << " "; vListas[i].mostrarLista(); } return; } void CrearItem(){ int numLista; cout << "Seleccione lista para crear item: "; cin >> numLista; vListas[numLista-1].crearItem(); return; } ~ToDo(){ delete []vListas; return; } }; class Menu{ private: ToDo ToDoPractica; bool RepetirBucle; public: Menu(){ RepetirBucle = true; return; } void Mostrar(){ int opcion; cout << ":::...ToDo...:::" << endl; ToDoPractica.MostrarListas(); cout << endl << ":::...Menu...:::" << endl; cout << "1) Nueva lista" << endl; cout << "2) Nuevo item" << endl; cout << "3) Validar item" << endl; cout << "4) Purgar validados" << endl; cout << "5) Terminar" << endl; cout << "Seleccione opcion: "; cin >> opcion; switch(opcion){ case 1: ToDoPractica.CrearLista(); break; case 2: ToDoPractica.CrearItem(); break; case 3: //ToDoPractica.ValidarItem(); break; case 4: //ToDoPractica.PurgarValidados(); break; case 5: //RepetirBucle = false; break; default: cout << endl << "Error: La opcion seleccionada no existe."; Sleep(1200); break; } } bool getRepetirBucle(){ return(RepetirBucle); } }; void FuncionPractica1(){ Menu MenuPractica; while(MenuPractica.getRepetirBucle()){ MenuPractica.Mostrar(); } return; } int main(){ FuncionPractica1(); return 0; }