2011-01-09 11 views
0

問題があります。私は基本クラスから派生した異なるクラスオブジェクトの配列を作成しようとしています。私はこのクラスからCDおよびDVDの配列を作成しようとしている、今クラスオブジェクトの配列を別のクラス内に作成する

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(); 
}; 

:これはコードです

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->ベクトル[nrProduse]を指し

- > afisCamp();

何が問題なのですか?誰でも助けてくれますか?ありがとう!

+0

ポスト:: afisCamp (); – Mahesh

+0

ListaProduse :: afisCamp(); Cdvd :: afisCamp()、CD :: afisCamp()、DVD :: afisCamp()しかありません。 –

+0

上下にスクロールするときにちょうど名前と混乱しました!申し訳ありません – Mahesh

答えて

0

ありがとうございました。問題は、それが

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

私のミスになるはずだった

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

にありました。 :(とstd ::ベクトルとのアイデアは素晴らしい以上のですが、私はポリモーフィズムを使用して(学校用)私のプロジェクトを行う必要があります。

はありがとうございました!あなたはListaProduseで書かれたもの

0
vector=new Cdvd*[dimMax]; 

ベクターの種類はCdvd**です。つまり、Cdvdへのポインタへのポインタです。上記のコードでは、タイプがCdvd*のメモリだけを割り当てました。あなたは

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

ない理由:あなたはこれを行うことによって、何をしようとしてあるvector[i]->afisCamp()などのアクセスもでき、この後

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

:あなたはまだこのような何かをする必要があります代わりにstd::vector<Cdvd*>を使用しますか?私はSTLのvectorについて話しています。

+0

しかし、私は割り当てているか分からない。それはファイルからデータを読み取り、依存します。それはタイプCDまたはDVDであることができます。重要な点は、読み込まれたファイルデータに応じて、CDおよびDVDオブジェクトの配列を作成することです。 –

+0

ベクトル[nrProduse] =新しいCDを追加しました。 //またはDVDをx-> parseFis(.......)の後に入れてもまだ動作しません。 –

+0

@Ionut Ungureanu:それに応じてforループを作成し、if/elseブロックをいくつか入れ、ファイルからの入力に応じて、CDとDVDの配列を作成します。しかし、私はまだ 'std :: vector'を使うことを提案しています – Nawaz

2

あなたの現在の問題の実際の原因については、わかりません。しかし、私は一つのことを知っています:あなたはおそらくC++を書いていますが、char*と他の邪悪なC-ismsを使っています。

std::string,std::vectorなどを使用してください。あなたの問題が早急に解決されることをお約束します。

+0

+1完全に合意しました。 char *と配列を使うことで、非常に多くのバグの可能性があるパスを開くことができます。私がstd :: stringとstd :: vectorを使用して以来、私にはもう起こっていないそれらのバグは、メモリとサイズ管理のすべての汚い作業の世話をします。 –

関連する問題