単一の抽象クラスのすべての継承者であるさまざまな型のクラス標本を格納するコンテナーを正しく構築することに問題があります。レジスタ (コンテナー) は、抽象クラスの型を持つ、これらの標本の配列へのポインターを格納します。標本に含まれるデータにアクセスしようとすると、基本クラスにもある部分しか取得できません。たとえば、オーバーロードされた << は、3 つの継承子すべての要素を含むレジスタで使用され、抽象クラス部分のみを画面に書き込み、そこに存在しないものはすべて無視します。問題が正しく保存された要素の出力にあるのか、それとも不適切な形式で保存されているのかはわかりません。コードは次のとおりです。
class Register{
private:
int elementNum;
type * pData;
friend std::ostream &operator<<(std::ostream & os,const Register &v);
};
class type{
int a;
int b;
};
class type2: public type{
int c;
int d;
};
他の 2 つの継承者は、type2 と同じように動作します。ここにメインの一部があります:
int main ()
{
type2 A1(1,2,3,4);
type3 D1(4,5,6,7,8);
type4 H1(9,10,11,12,13);
std::cout<<A1<<D1<<H1<<endl;
Register R1;
R1.Add(0,A1);
R1.Add(1,D1);
R1.Add(2,H1);
R1.Display();
R1.MaxLength();
std::cout<<R1;
return 0;
}
レジスタ上の演算子 <<:
std::ostream &operator<<(std::ostream & os,const Register &v){
for(int i=0;i<v.elementNum;i++)
{
os<<v.pData[i]<<endl;
}
return os;
}
<< 演算子またはレジスタからの関数を使用するだけで、この問題は終了します。編集:追加機能の実装:
void Register::Add(int position,type& T){
if(position<0||position>elementNum+1)
return;
type *pTemp = new type[elementNum+1];
if(elementNum==0)
{
pTemp[0]=T;
delete[]pData;
pData=pTemp;
}
else
{
for(int i=0,j=0;j<elementNum+1;i++,j++)
{
if(position!=j)
pTemp[j]=pData[i];
else
{
i--;
pTemp[j]=a;
}
}
delete[]pData;
pData=pTemp;
}
elementNum++;
}