我在正确构建一个容器时遇到问题,该容器存储不同类型的类样本,这些类样本都是单个抽象类的继承者。寄存器(容器)存储指向这些样本数组的指针,该数组具有抽象类的类型。每当我尝试访问样本中包含的数据时,我只能成功地检索到也可以在基类中找到的部分。例如,在包含所有三个继承者的元素的寄存器上使用的重载 <<,只会在屏幕上写入抽象类部分,并且会忽略不存在的任何内容。现在我真的不知道问题是否在于打印出其他正确存储的元素,或者存储已经以不适当的形式完成,所以这将是我的问题:应该如何正确完成?这是代码:
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;
};
其他两个继承者的行为与 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++;
}