C++ 在另一个类中创建类对象数组

C++ 在另一个类中创建类对象数组,c++,arrays,class,object,C++,Arrays,Class,Object,我有个问题。我试图创建一个从基类派生的不同类对象的数组。代码如下: 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

我有个问题。我试图创建一个从基类派生的不同类对象的数组。代码如下:

 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();
};
这是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()
{
nrProduse=0;
矢量=新的Cdvd*[dimMax];
}
ListaProduse::~ListaProduse()
{
如果(nrProduse>0)
{
删除向量;
}
}
void ListaProduse::adauga(std::fstream&in)
{
if(in.is_open())
{
int pret、CAN、cod;
char temp1[20],aux1[20];
char aux;
而(!in.eof())
{
在>>辅助;
在>>temp1中;
char*teemp1=新字符[strlen(temp1)+1];
strcpy(teemp1,temp1);
在>>pret;
在>>超文本中;
在>>化学需氧量;
开关(辅助){
案例“C”:{
int-nrTr,肺;
在>>aux1;
char*auxiliar1=新字符[strlen(aux1)+1];
strcpy(辅助1,aux1);
在>>aux1;
char*auxiliar2=新字符[strlen(aux1)+1];
strcpy(辅助2,aux1);
在>>nrTr;
在>>肺;
CD*x;
x=新CD;
x->parseFis(teemp1、pret、cant、cod、辅助1、辅助2、nrTr、肺);
向量[nrProduse]=x;
向量[nrProduse]->afisCamp();
//cout>aux1;
char*auxiliar1=新字符[strlen(aux1)+1];
strcpy(辅助1,aux1);
在>>aux1;
char*auxiliar2=新字符[strlen(aux1)+1];
strcpy(辅助2,aux1);
在>>肺;
DVD*x;
x=新DVD;
x->parseFis(teemp1、pret、cant、cod、辅助1、辅助2、肺);
向量[nrProduse]=x;
向量[nrProduse]->afisCamp();
nrProduse++;
打破
}
};
}
}
}
void ListaProduse::afisare()
{
如果(nrProduse>0)
对于(int i=0;ivector[nrProduse]->afisCamp();
}
其他的
库特
vector的类型为
Cdvd**
;即指向Cdvd的指针。在上述代码中,您只分配了
Cdvd*
类型的内存。您仍然需要执行以下操作:

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

<>你为什么不使用<代码> STD::向量<代码> >我在说STL的代码>向量< /> >

< p>你知道,你当前问题的实际原因,但我知道一件事:你大概是写C++,但是使用<代码> char */COD>和其他邪恶的C-ISM。
使用
std::string
std::vector
等等,我向您保证,您的问题会很快解决。

非常感谢。问题已解决

this->vector[nrProduse]->afiscamp();
应该是

this->vector[i]->afisCamp();
我的错误。:(std::vector的想法非常棒,但我必须使用多态性来完成我的项目(为学校)


再次感谢您!

发布您在ListaProduse::afisCamp()中所写的内容;没有ListaProduse::afisCamp();只有Cdvd::afisCamp()、CD::afisCamp()和DVD::afisCamp()。只是在上下滚动时被名称弄糊涂了!抱歉,但我不知道我在分配什么。它从文件中读取数据并依赖于。它可以是CD或DVD类型。重点是根据读取的文件数据创建一个CD和DVD对象数组。我在x->parseFis(…)之后添加了向量[nrProduse]=new CD;//或DVD仍然不起作用。@Ionut Ungureanu:您可以相应地编写for循环,放置一些if/else块,并根据文件的输入创建一个CD和DVD数组。但是我仍然建议使用
std::vector
@Ionut:为什么不使用
进行
循环和
I
(从0到dimMax),以分配内存,而不是执行
vector[nrProduse]=new CD;
?nrProduse是什么?您到底想做什么?@Nawaz
vector=new Cdvd*[dimax]
在这种情况下,
*
有什么建议?我不明白。这只是一个类型转换吗?+1完全同意。通过使用char*和数组,您打开了无数可能的错误的路径。这些错误在我使用std::string和std::vector后不再发生,它们解决了内存和大小管理的所有脏活。
this->vector[nrProduse]->afisCamp();
this->vector[nrProduse]->afiscamp();
this->vector[i]->afisCamp();