2011-10-14 3 views
1

저는 지금 막 붙어 있습니다. BaseBond라는 기본 클래스가 있습니다. ZeroCouponBond 및 CouponBond는 해당 클래스를 상속합니다. 채권의 두 가지 유형을 모두 포함하는 배열을 만들려고합니다. 오류 :기본 클래스의 배열에 대한 C++ - 기본 오류

여기
... 
BaseBond port[12]; 

for (int i=0; i < recordCount; i++) 
{ 
    if (bonds[i].CouponRate == 0.0) 
     port[i] = new ZeroCouponBond(bonds[i]); 
    else 
     port[i] = new CouponBond(bonds[i]); 
} 

나는 점점 오전 오류가 있습니다 : 여기 내 코드와 아무 짝 '연산자 ='포트 '에 [i]를

나는 이것이 아마도 간단한 수정하고 있습니다 알고 배열에서 객체를 선언 할 수있을 때해야 할 일이 있지만 C++에 비교적 익숙하지 않으며 모든 규칙을 알지 못합니다.

미리 도움을 청하십시오!

답변

3

당신이 사용하여 포인터를 수행해야합니다

변경이로 선언 :

BaseBond *port[12]; 

원래 코드에서를, 당신은 BaseBond에 대한 포인터를 할당하고있었습니다. 그래서 컴파일되지 않습니다.

또한 이와 같은 상속을 사용하면 객체 조각을 방지하기 위해 포인터를 사용하여 포인터를 사용해야합니다.

+0

신비로운! 마지막 질문. 이제 CouponBond 클래스의 메서드에 액세스하려는 경우 어떻게해야할까요? 배열 포트가 이제 BaseBonds 배열임을 알고 있습니다. 그 방법에 접근하기 위해서는 우선 CouponBond로 캐스팅해야만합니까? 이 코드의 문제점 : port [i] = 새로운 CouponBond (bonds [i]); printf ("P : % f", ((CouponBond) port [i]) -> getPrice()); – CHawk

+1

그 방법이'CouponBond' 클래스에만 해당된다면, 실제로 그렇게 할 수는 없습니다. 그래서 당신은 그것을 던져야 할 것입니다 -이 시점에서 당신은 그것을 적절하게 설계했는지에 대해 더 신중하게 생각해야합니다. 이상적으로, 그 메소드는'BaseBond' 클래스에 있고 각각의 서브 클래스에 의해 오버라이드됩니다. – Mysticial

+1

방금 ​​의견을 보았습니다. 이 경우,'BasePlay' 클래스에'getPrice' 메쏘드를 정의하고 그것을 가상으로 만들어야합니다. (그것은'getPrice'가 모든 "bond"에 적용되기 때문에 의미가 있습니다) 그리고 나서'CouponBond'에 특정한 버전으로 그것을 오버라이드 할 수 있습니다. – Mysticial

관련 문제