Создать массив объектов класса внутри другого класса - PullRequest
0 голосов
/ 09 января 2011

У меня проблема.Я пытаюсь создать массив объектов различных классов, полученных из базового класса.Это код:

 class Cdvd{
protected:
 char *numeArtist; //numer artist sau film
 char *tip;// CD sau DVD
 int cantitate; //numar de CD/DVD din baza de date
 int pret; //pret per unitate
 int cod_intern; //cod intern produs. Spre exemplu 0 pentru un film horror.
 void scriereInFisier(std::fstream &out); //scriere in fisierul cu produse
public:
 Cdvd(); //constructor produs implicit
 Cdvd(const Cdvd &cdvd); //constructor produs cu parametru alt produs
 Cdvd(char *artist, char *tip, int cant, int pret, int cod_int); //constructor produs cu parametri
 ~Cdvd(); //destructor produs
 char *getNume(); //returneaza pointer la numele artistului sau filmului
 void parseFis(char *artist, char *tip, int cant, int pret, int cod_int);
 virtual void afisCamp()=0; //afiseaza campurile produsului
};


class CD : public Cdvd{
private:
 char *genMuzica; //genul muzicii
 char *extensie; //extensia fisierelor audio
 int nrTrackuri; //numar melodii
 int lungime; //lungime totala melodii
public:
 CD(); //constructor implicit cd
 CD(char *artist, int cant, int pret, int cod_int, char *genMuzica, char *extensie, int nrTrackuri, int lungime);
 CD(const CD &cd); //constructor cd cu parametru alt cd
 ~CD(); //destructor cd

 void parseFis(char *artist, int cant, int pret, int cod_int, char *genMuzica, char *extensie, int nrTrackuri, int lungime);
 void afisCamp(); //afiseaza campurile cd-ului
};

class DVD : public Cdvd{
private:
 char *genFilm;
 char *extensie;
 int lungime;
public:
 DVD();
 DVD(char *artist, int cant, int pret, int cod_int, char *genFilm, char *extensie, int lungime);
 ~DVD(){cout<<"~DVD()"<<endl;};

 void parseFis(char *artist, int cant, int pret, int cod_int, char *genFilm, char *extensie, int lungime);
 void afisCamp();
};

Теперь я пытаюсь создать из этого класса массив CD и DVD:

class ListaProduse{
 static const int dimMax=20; //dimensiune maxima lista produse
 Cdvd **vector; //vector in care se retin produsele
 int nrProduse; //retine cate produse sunt in baza de date
public:
 ListaProduse();
 ~ListaProduse();
 void adauga(std::fstream &in);
 void afisare();
};

, и это код для класса ListaProduse:

ListaProduse::ListaProduse()
{
 nrProduse=0;
 vector=new Cdvd*[dimMax];
}

ListaProduse::~ListaProduse()
{
 if(nrProduse>0)
 {
  delete vector;
 }
}

void ListaProduse::adauga(std::fstream &in)
{
 if(in.is_open())
 {
  int pret,cant,cod;
  char temp1[20],aux1[20];
  char aux;

  while(!in.eof())
  {
   in>>aux;
   in>>temp1;
   char *teemp1=new char[strlen(temp1)+1];
   strcpy(teemp1,temp1);
   in>>pret;
   in>>cant;
   in>>cod;
   switch(aux){
    case 'C':{
     int nrTr,lung;
     in>>aux1;
     char *auxiliar1=new char[strlen(aux1)+1];
     strcpy(auxiliar1,aux1);
     in>>aux1;
     char *auxiliar2=new char[strlen(aux1)+1];
     strcpy(auxiliar2,aux1);
     in>>nrTr;
     in>>lung;
     CD *x;
     x=new CD;
     x->parseFis(teemp1,pret,cant,cod,auxiliar1,auxiliar2,nrTr,lung);
     vector[nrProduse]=x;
     vector[nrProduse]->afisCamp();
     //cout<<vector[nrProduse]->numeArtist;
     nrProduse++;
     break;
        }
    case 'D':{
     int lung;
     in>>aux1;
     char *auxiliar1=new char[strlen(aux1)+1];
     strcpy(auxiliar1,aux1);
     in>>aux1;
     char *auxiliar2=new char[strlen(aux1)+1];
     strcpy(auxiliar2,aux1);
     in>>lung;
     DVD *x;
     x=new DVD;
     x->parseFis(teemp1,pret,cant,cod,auxiliar1,auxiliar2,lung);
     vector[nrProduse]=x;
     vector[nrProduse]->afisCamp();
     nrProduse++;
     break;
        }
   };
  }
 }
}

void ListaProduse::afisare()
{
 if(nrProduse>0)
  for(int i=0;i<nrProduse;i++)
  {
   this->vector[nrProduse]->afisCamp();
  }
 else
  cout<<"Nu exista produse in baza de date!"<<endl;
}

Теперь я создаю в основном экземпляр ListaProduse.Я вызываю ListaProduse.adauga (filein), а затем ListaProduse.afisare ().Проблема в том, что когда я вызываю afisare (), программа перестает работать и говорит:

Необработанное исключение в 0x00ba3055 в test.exe: 0xC0000005: Место чтения нарушения доступа 0xcdcdcdcd.

указывает на

this-> vector [nrProduse] -> afisCamp ();

В чем может быть проблема?Может кто-нибудь мне помочь?Спасибо!

Ответы [ 3 ]

2 голосов
/ 09 января 2011

Ну, что касается действительной причины вашей нынешней проблемы, я не знаю.Но я знаю одно: вы, вероятно, пишете на C ++, но используете char* и другие злые C-измы.

Используйте std::string, std::vector и т.п., и я вас уверяю, что ваши проблемыбыстро пойдет.

0 голосов
/ 09 января 2011

Большое спасибо.Проблема была на

this->vector[nrProduse]->afiscamp();

Она должна была быть

this->vector[i]->afisCamp();

Моя ошибка.:( И идея с std :: vector более чем великолепна, но я должен сделать свой проект (для школы), используя полиморфизм.

Еще раз спасибо!

0 голосов
/ 09 января 2011
vector=new Cdvd*[dimMax];

вектор имеет тип Cdvd**; то есть указатель на указатель на Cdvd. В приведенном выше коде вы только выделяли память типа Cdvd*. Вам все еще нужно сделать что-то вроде этого:

for(int i = 0 ; i < dimMax ; i++ )
    vector[i] = new Cdvd; //or new CD or new DVD;

После этого вы можете получить доступ как vector[i]->afisCamp(), что вы пытаетесь сделать, выполнив следующее:

this->vector[nrProduse]->afisCamp();

Почему бы вам не использовать std::vector<Cdvd*> вместо этого? Я говорю о STL vector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...