class Shape
{
public:
Shape() {size=0;}
virtual bool isequal(const Shape& rhs){return false;};
int size;
};
클래스 모양을 상속받은 두 개의 클래스 (Rectangle 및 Cirle)가 있습니다.가상 클래스 및 다형성
class Circle : public Shape
{
public:
// snip
Circle(int size): size(size) {}
Circle(const Circle & rhs): size(rhs.size){}
bool isequal(Shape &rhs)
{
Circle* rhsAsCircle = dynamic_cast<Circle*>(&rhs);
if(rhsAsCircle == nullptr)
return false; // not a Circle; can't be equal
return size==rhsAsCircle->size;
}
int size;
};
class Rectangle : public Shape
{
public:
Rectangle(int size1,int size2): size1(size1),size2(size2) {}
Rectangle(const Rectangle & rhs): size1(rhs.size1),size2(rhs.size2) {}
bool isequal(Shape &rhs)
{
Rectangle* rhs2 = dynamic_cast<Rectangle*>(&rhs);
if(rhs2 == nullptr)
return false; // not a Rectangle; can't be equal
return (size1==rhs2->size1 && size2==rhs2->size2);
}
int size1;
int size2;
};
나는 벡터에서 다른 모양을 저장하고 전, 사각형/원 추가 사각형/원 삭제 (다른 : 운용을 수행하는 클래스 P를 사용합니다.
class P
{
public:
P(){}
bool add(Rectangle rhs)
{
uint i=0;
while (i<v.size() && rhs.isequal(*v[i])==false)
i++;
if (i!=v.size())
return false;
v.push_back(new Rectangle(rhs));
return true;
}
bool add(Circle rhs)
{
uint i=0;
while (i<v.size() && rhs.isequal(*v[i])==false)
i++;
if (i!=v.size())
return false;
v.push_back(new Circle(rhs));
return true;
}
vector<Shape*> v;
};
이 모양 (사각형 또는 원을 추가하려면) 함수를 오버로드해야만했습니다. 하나의 함수 만 수행하는 방법이 없습니까? 원 및 사각형은 모양이므로 아니기 때문에
'Shape'에 추상 메소드'Shape * Clone() = 0;'을 선언하면'add()'함수에서 호출 할 수 있습니다 (그리고'Shape * 전문 수업). 그것은 당신의 벡터에있는 요소를'v.push_back (rhs.Clone());으로 밀어 넣을 것입니다. BTW 그 객체의 사본을 만들어야한다면 그 디자인을 검토 할 것입니다 ... 아마 피할 수 있습니다. –
@Adriano 감사. 왜 디자인을 검토하고 무엇을 바꾸겠습니까? – bandera
'Shape *'을 저장하는 이유를 모르겠지만'add()'는'Rectangle' 대신에'Rectangle'을 허용합니다. 이것은 당신이 당신의 객체 사본을 만들도록 강요합니다 ('new Rectangle (rhs)'). 물론 매개 변수가 템플릿 객체라면 실제로 복제하고 싶습니다. 그러나 방금 생성 된 것이라면 그 객체를 삭제할 것이고 유일한 목적은'add()'의 매개 변수가되는 것입니다. –