단일 추상 클래스의 상속자가되는 다른 유형의 클래스 표본을 저장하는 컨테이너를 올바르게 작성하는 데 문제가 있습니다. 레지스터 (컨테이너)는 추상 클래스의 유형을 가진 이러한 표본의 배열에 대한 포인터를 저장합니다. 표본에 포함 된 데이터에 액세스하려고 할 때마다 기본 클래스에서 찾을 수있는 부분 만 검색하는 데 성공합니다. 예를 들어 레지스터에 사용 된 오버로드 된 < <은 세 가지 상속자의 요소를 모두 포함하며 화면에 추상 클래스 파트 만 쓰고 존재하지 않는 것은 무시합니다. 이제는 문제가 제대로 저장된 요소를 인쇄하는 것과 관련이 있는지 또는 저장이 이미 부적절한 형식으로 수행되었는지는 알 수 없으므로 문제가 될 수 있습니다. 어떻게 제대로 수행해야합니까? 코드는 다음과 같습니다.이질적인 컨테이너 생성/관리 (C++)
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++;
}
'Register :: Add'구현을 보여주십시오. 그것은 당신이 생각하는 것처럼 할 수는 없습니다. – aschepler
그에 따라 업데이트되었습니다. – ClarkJohns
아래에 답변에 추가되었습니다 :'sizeof (type)'바이트를 담을만큼 큰 배열 슬롯에만'type2'를 저장할 수 없습니다. 다형성을위한 포인터 배열이 필요합니다. – Jeff