2009-10-27 8 views
2

추상적 인 형식이어야합니다 :C++ 오류 : 필드를 선언 할 수 없습니다 것은이 상황이다

class Base { 
    virtual void methodA() = 0; 
    virtual void methodB() = 0; 
}; 

class Base_A : public Base { 
    void methodA(); 
    void methodB(); 
}; 

class Base_B : public Base { 
    void methodA(); 
    void methodB(); 
}; 

class MyClass { 
    private: 
     Base * b; 
}; 

내가 오류 메시지가 제공 컴파일 :

error: cannot declare field MyClass::b to be of abstract type because the following virtual functions are pure within Base:
Base::methodA()
Base::methodB()

방법이 문제를 해결하기를?

업데이트 지금 컴파일됩니다. 내가 무엇을 변경했는지 알지 못합니다.

+7

'Base b;가 아닌'Base * b; '입니까? – sharptooth

+1

코드 스 니펫이 정확합니까? 그것은 실제로 OK를 컴파일하고 정확합니다. 아마도 원래 코드는 'Base * b'대신 'Base b'였을 것입니다. '기지 b'는 당신이 겪고있는 오류를 줄 것입니다. – Skizz

+3

또한 Base 소멸자를 가상으로 만드는 것을 잊지 마십시오. – Naveen

답변

2

내 컴퓨터에서 코드 스 니펫이 정상적으로 컴파일됩니다. Base* b을 사용하고 있습니까? 포인터 유형이 아닌 Base b?

+0

필자는 추측하고 있습니다. 컴파일러 오류가 포인터가 아닌 추상 형식에 대해 말하기 때문입니다. –

+1

@ 율리우스 : 네, 자료는 추상적입니다. 이 유형의 필드 ('Base b')를 만들려고하면 컴파일러는 MyClass :: b 필드를 추상 형식 *으로 선언 할 수 없다는 불평을합니다. 추상적 인 유형에 대한 포인터는 추상이 아니며, OP의 예 ('Base * p')가 작동해야합니다. –

4

코드가 정확하고 완벽하게 보입니다.

기본 클래스이므로 추상화하면 개체를 만들 수 없지만 확실히 포인터를 선언 할 수 있습니다.

Base * b 대신 Base b를 쓸 수도 있으므로 확인하십시오.

관련 문제