2013-01-31 2 views
13

나는 기본 클래스 일부 ommitied 코드 분명히순수 가상 함수가없는 C++ 추상 클래스?

class ShapeF 
{ 
public: 
    ShapeF(); 
    virtual ~ShapeF(); 

    inline void SetPosition(const Vector2& inPosition) { mPosition.Set(inPosition); } 

protected: 
    Vector2 mPosition; 
} 

있다, 그러나 당신은 점을 얻는다. 나는 템플릿으로 사용하고, 재미 (ommited) 열거 형으로, 방법은 내가

class RotatedRectangleF : public ShapeF 
{ 
public: 
    RotatedRectangleF(); 
    virtual ~RotatedRectangleF(); 
protected: 
    float mWidth; 
    float mHeight; 
    float mRotation; 
} 

가 ShapeF가 위치와의 일을 사용하고 무엇을 정의하는 열거하고있어 모양의 종류를 결정하기 위해 유형은입니다. 접근 자 및 변경자가 있지만 메소드는 없습니다.

ShapeF를 추상 클래스로 만들어 아무도 ShapeF 유형의 객체를 초기화하지 못하도록 할 수 있습니까?

일반적으로, 이것은 그러나, 나는 현재 별도의 클래스의 충돌을 처리하고 ShapeF

//ShapeF.h 
virtual void Collides(const ShapeF& inShape) = 0; 

내에서 순수 가상 함수를함으로써 행할 수있다. 나는 모든 것을 옮길 수 있지만 순수 가상 함수가없는 클래스 추상을 만드는 방법이 있는지 궁금합니다.

+0

태그 지정 (열거) 및 캐스팅을 사용하여 동적 디스패치를 ​​다시 구현하려고합니다. 곧 향후에 문제가 될 것입니다. 나는 디자인을 재고 할 것이다. –

+0

@ DavidRodríguez-dribeas 나는 이것이 가장 쉬운 방법이라고 생각했다. 모든 것을 static_casting했다. 다시 디자인하고 싶다면 모든 다형성이있는 ShapeF()를 모두 제거하고 각각의 모양을 자신의 사람으로 만듭니다. 다른 제안이 없다면? – MintyAnt

답변

39

당신은 선언 , 순수 가상 소멸자를 구현할 수 :

class ShapeF 
{ 
public: 
    virtual ~ShapeF() = 0; 
    ... 
}; 

ShapeF::~ShapeF() {} 

그것은 당신이 이미 가지고있는 것과 작은 단계, 그리고 직접 인스턴스화하는 것을 ShapeF을 방지 할 수 있습니다. 파생 클래스는 변경할 필요가 없습니다.

+3

빠른 질문 - 왜'~ ShapeF'는 '순수 가상'으로 선언 될 때 구현되어야합니까? –

+0

감사합니다. 이것은 완벽하게 작동합니다. 왜이게 효과가 있니? 순수 가상을 정의 할 수 없다고 생각했습니다. – MintyAnt

+4

정의해야합니다. 그렇지 않으면 파생 클래스가 기본 클래스를 삭제할 수 없습니다. 순수 가상 함수를 정의 할 수 있으므로 파생 클래스가 해당 함수에 위임 할 수 있습니다. –

18

보호 된 생성자를 사용해보세요

+0

+1, 소멸자는 '보호'되어야하며 가상이 아닙니다. 'ShapeF'가'new'-ed이고 결코'delete'-d가 아니라면 문제를 해결할 수없는 구석이 있습니다. (그러나 그 자체로 버그입니다) –

+0

@DadridRodríguez-dribeas 왜 소멸자가 보호되어야합니까? ? 보호 된 경우 개체를 삭제할 수 없습니다. –

+0

@JamesKanze : 나는 *해야한다고 * 강한 단어입니다. 소멸자가'가상'이라는 유일한 이유는 유형이 파생되어야한다는 것을 항상 * 소멸자를 가상으로 만드는 권고를 따르는 것입니다.소멸자를 'protected'로 만드는 것은 동일한 근본적인 문제를 해결하고 인스턴스를 생성하지 않는 문제에 대한 해결책을 제공합니다 (적어도 메모리 누수에 만족하지 않으면 스택이나 힙에서 해결할 수 있습니다 :). 디자인을 재검토해야합니다 (질문에 대한 언급에서 언급했듯이) –

관련 문제