• Domingo 15 de Diciembre de 2024, 16:32

Autor Tema:  Re: Problema Con Asignacion Dinamica De Memoria  (Leído 850 veces)

waters

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Problema Con Asignacion Dinamica De Memoria
« en: Lunes 9 de Junio de 2008, 01:50 »
0
Hola. que tal? este es mi primer mensaje en el foro. cree una clase coleccion a la cual se le pueden agregar y eliminar objetos de una clase disco y tambien imprimirlos en pantalla. tengo un problema con el metodo agregardisco, se copian mal los datos y al cerrar la aplicacion el compilador me da un mensaje de error.
hay partes que estan comentadas y otras que las agregue recientemente, ya que probe de todo y no anda.
espero que prueben el codigo para que vean bien cuales son sus fallas.
espero una respuesta y la agradezco
saludos.

Clase fecha :


#ifndef FECHA_H
#define FECHA_H
#include <iostream>
#include <cstdlib>

using namespace std;

class Fecha
{
public:
Fecha(int=1,int=1,int=2007);
~Fecha();
void imprimefecha()const;
int getdia()const;
int getmes()const;
int getanio()const;
void setdia(int);
void setmes(int);
void setanio(int);
void setfecha(int,int,int);
private:
int dia;
int mes;
int anio;
};

#endif


#include "Fecha.h"

Fecha::Fecha(int d,int m,int a)
{
setfecha(d,m,a);
}

Fecha::~Fecha()
{
               
}

void Fecha::setfecha(int d,int m,int a)
{
setdia(d);
setmes(m);
setanio(a);
}

void Fecha::setanio(int a)
{
    if((a>1900) && (a< 2200))
    {
    anio=a;
    }
    else
    {
    anio=2007;
    }
}

void Fecha::setmes(int m)
{
    if((m>=0) && (m<13) )
    {
    mes=m;
    }
    else
    {
    mes=1;
    }
}

void Fecha::setdia(int d)
{

   // verificardia(d)  crearia una funcion para verificar que el dia ingresado es correcto
                               
  dia=d;
}  
 
int Fecha::getanio()const
{
return anio;
}

int Fecha::getmes()const
{
return mes;
}

int Fecha::getdia()const
{
return dia;
}

void Fecha::imprimefecha()const
{
cout<<dia<<"/"<<mes<<"/"<<anio<<endl;
}
         

Clase Discos :

#ifndef DISCOS_H
#define DISCOS_H
#include <cstring>
#include <iostream>
#include <stdlib.h>
#include "Fecha.h"

using namespace std;

class Discos
{

friend ostream & operator<<(ostream&,const Discos &);


public:
Discos();
Discos(string,string,int);
Discos(string,string,int,int,int,int,int,int);
~Discos();
string getnombredisco()const;
string getinterprete()const;
void setnombredisco(string);
void setinterprete(string);
static int getcantidaddiscos();
void setcantidadtemas(int);
void settema(string,int);
void operator+();
void operator-();


private:
string nombredisco;
string interprete;
Fecha  lanzamiento;
int minduracion;
int segduracion;
static int cantidaddiscos;
string *temas;
int cantidadtemas;
bool dond;
};

#endif


#include "Discos.h"
#include <conio.h>
#include <stdio.h>
#include <cstdlib>



using namespace std;



ostream & operator<<(ostream & salida, const Discos &cd)
{
salida<<"CD ="<<cd.getnombredisco()<<endl<<"Artista = "<<cd.getinterprete();
}

void Discos::operator+()
{
    cout<<endl;
   
    if(dond==false)
    {
   
        for(int j=0;j<cantidadtemas;j++)
            {
            cout<<"track 0"<<j+1<<":"<<temas[j]<<endl;
            }
    }
    dond=true;

}    

void Discos::operator-()
{
    if(dond==true)
    {
    system("CLS");
    cout<<nombredisco<<endl<<interprete;
    }
    dond=false;
}

int Discos::cantidaddiscos=0;

Discos::Discos()
{
nombredisco="xx";
interprete="yy";
cantidaddiscos++;
cantidadtemas=0;
minduracion=0;
segduracion=0;
temas=NULL;
dond=false;
}


Discos::Discos(string nomdisc,string interp,int ct)
{
nombredisco=nomdisc;
interprete=interp;
cantidaddiscos++;
cantidadtemas=ct;
minduracion=10;
segduracion=10;
temas=new string [ct];
    for(int i=0;i<ct;i++)
    {
    temas="track 01";
    }    
dond=false;   //significa que no esta desplegada la lista de temas
}

Discos::Discos(string nomdisc,string interp,int ct,int md,int sd,int dl,int ml,int al):lanzamiento(dl,ml,al)
{
nombredisco=nomdisc;
interprete=interp;
cantidadtemas=ct;
cantidaddiscos++;
minduracion=md;
segduracion=sd;
temas=new string [cantidadtemas];
    for(int i=0;i<cantidadtemas;i++)
    {
    temas="track 01";     }    
dond=false;

}

Discos::~Discos()
{

if(temas!=NULL)
{
delete []temas;
}
else
{
    delete temas;
}

cantidaddiscos--;
}

string Discos::getinterprete()const
{
return interprete;
}

string Discos::getnombredisco()const
{
return nombredisco;
}

int Discos::getcantidaddiscos()
{
return cantidaddiscos;
}

void Discos::setcantidadtemas(int ct)
{
    if(ct>0)
    {
    cantidadtemas=ct;
    }
    else
    {
    cantidadtemas=1;
    }

}

void Discos::setinterprete(string interp)
{
interprete=interp;
}

void Discos::setnombredisco(string ndisc)
{
nombredisco=ndisc;

}

void Discos::settema(string nomtema, int numtema)
{
    for(int i=0;i<cantidadtemas;i++)
    {

        if(i==numtema-1)
        {
        temas=nomtema;
        }
    }    
}

     

Clase coleccion :


#ifndef COLECCION_H
#define COLECCION_H
#include "Discos.h"

using namespace std;

class Coleccion
{





public:
Coleccion();
Coleccion(string);
void modificarinterprete(string);
void modificarnombredisco(string);
void imprimirtodoslosdiscos();
void agregardisco(Discos);
void eliminardisco(/*&*/Discos);
Discos operator[](int);


~Coleccion();
private:
Discos * cds;
int cantdiscos;      
string nombrecoleccion;
void ordenarporfecha();
};
#endif


#include "Coleccion.h"





/*ostream & operator<<(ostream & salida ,const Coleccion & c)
{
salida<<c.imprimirtodoslosdiscos();
}*/


void Coleccion::imprimirtodoslosdiscos()
{
   int i=0;                                
 
   
   if(cds==NULL)
   {
   cout<<"No hay discos cargados en la coleccion"<<endl;
   }
   else
   {
   
 
      for(int i=0;i<cantdiscos;i++)
      {
     
      cout<<endl;
      cout<<cds;        
     
      }
   
   }

}

Discos Coleccion::operator[](int i)
{

return cds;
       
}      

Coleccion::Coleccion()
{
cds=NULL;
nombrecoleccion="Coleccion predeterminada";
cantdiscos=0;
}

Coleccion::Coleccion(string nc)
{
cds=NULL;
nombrecoleccion=nc;
cantdiscos=0;
}

Coleccion::~Coleccion()
{

delete [] cds;

}

void Coleccion::modificarinterprete(string nint)
{


if(cds!=NULL)
{


int i=0;
string nuevonombre="";
cout<<endl;
cout<<"Ingrese el nuevo nombre de interprete : "<<endl;
cin>>nuevonombre;

  for(i=0;i<cantdiscos;i++)
  {

     if(cds.getinterprete()==nint)
     {
     cds.setinterprete(nuevonombre);
     break;
     
     }

  }

}

}

void Coleccion::modificarnombredisco(string nnd)
{
     
     
     
int i=0;
string nuevonombre="";
cout<<endl;
cout<<"Ingrese el nuevo nombre de disco : "<<endl;
cin>>nuevonombre;

  for(i=0;i<cantdiscos;i++)
  {

     if(cds.getnombredisco()==nnd)
     {
     cds.setnombredisco(nuevonombre);
     break;
     
     }

  }
     
     
     
     
}

void Coleccion::agregardisco(/*&*/Discos d1)
{

if(cds==NULL)
{
             cds=new Discos();
             cantdiscos++;
             return;
}

if(cantdiscos==1)
{
Discos * arraydiscos=new Discos[2];

arraydiscos[0]=cds[0];
delete cds;
cds=new Discos[2];

cds[0]=arraydiscos[0];
cds[1]=d1;
cantdiscos++;
}

Discos * arraydiscos=new Discos[cantdiscos+1];




for(int i=0;i<cantdiscos;i++)
{
        arraydiscos=cds;
    cout<<arraydiscos.getnombredisco()<<endl;
        cout<<cds.getnombredisco()<<endl;
}
arraydiscos[cantdiscos]=d1;
delete [] cds;
cantdiscos++;
cds=NULL;
cds=new Discos[cantdiscos];
cds=arraydiscos;

/*for(int i=0;i<cantdiscos;i++)
{
cds=arraydiscos;
}
*/


}

void Coleccion::eliminardisco(/*&*/Discos d1)
{
   
 
  /* if(cds==NULL)
   {
   cout<<"No se cargaron cds"<<endl;
   return;
   }            
   
   if(cantdiscos==1)
   {
   delete []cds;
   cds=NULL;
   cantdiscos--;
   }*/
   
   
   //Discos * arraydiscos=new Discos[cantdiscos-1];
     
  /* if(cds[cantdiscos-1].getnombredisco()==d1.getnombredisco())
     {
     
        for(int i=0;i<cantdiscos-2;i++)
        {
           arraydiscos=cds;
        }
        cds=NULL;
        cantdiscos--;
        cds=arraydiscos;            
                   
      }
      else
      {
         
          for(int i=0;i<cantdiscos;i++)
          {
             if(cds.getnombredisco()==d1.getnombredisco())
             {        
         
                 for(int j=i;j<cantdiscos-1;j++)
                 {
                         cds[j]=cds[j+1];
                         break;
                 }
             }
             else
              {
              break;
              return;
              }  
             
         
          }
         
           for(int k=0;k<cantdiscos-2;k++)
                 {
                 arraydiscos[k]=cds[k];
                 }
                 delete []cds;
                 cantdiscos--;
                 cds=arraydiscos;
         
               
                 

      }*/
           
                     

}

waters

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Problema Con Asignacion Dinamica De Memoria
« Respuesta #1 en: Jueves 12 de Junio de 2008, 03:21 »
0
olvide decir que el codigo compila y anda bien. los problemas los tengo al crear un main y probar los metodos. utilize el compilador dev-c++.
les dejo el codigo del main.


#include <cstdlib>
#include <iostream>
#include "Discos.h"
#include "Coleccion.h"

using namespace std;

int main(int argc, char *argv[])
{
   
  Coleccion  nuevacoleccion("Progresiva");
  Discos cd1("dark side of the moon","pink floyd",10,43,30,1,4,1973);
  Discos cd2,cd3("pepe","pf",10,43,20,1,4,1234),cd4,cd5,cd6,cd7,cd8,cd9,cd10;
  cout<<cd1;
  cd1.settema("speak to me",1);
  cd1.settema("breathe",2);
  cd1.settema("on the run",3);
  cd1.settema("time",4);
  cd1.settema("the great gig in the sky",5);
  cd1.settema("money",6);
  cd1.settema("us and them",7);
  cd1.settema("any colour you like",8);
  cd1.settema("brain damage",9);
  cd1.settema("eclipse",10);
  +cd1;
  nuevacoleccion.agregardisco(cd1);
  nuevacoleccion.agregardisco(cd2);
  nuevacoleccion.agregardisco(cd3);
 


 
  cout<<endl;
  //nuevacoleccion.imprimirtodoslosdiscos();
// nuevacoleccion.eliminardisco(cd10);
//  nuevacoleccion.imprimirtodoslosdiscos();
   
    system("PAUSE");
    return EXIT_SUCCESS;
}