C ++ - 파생 클래스에서 "회원 기능이 선언되지 않음"
-
06-07-2019 - |
문제
VS2008 이이 컴파일 오류를 던지는 MSVC ++ 2008에 문제가 있습니다.
error C2509: 'render' : member function not declared in 'PlayerSpriteKasua'
이제 나를 혼란스럽게하는 것은 Render ()가 정의되지만 상속 클래스에서 정의된다는 것입니다.
클래스 정의는 다음과 같이 작동합니다.
SpriteBase -Inherited By-> PlayerSpriteBase -Inherited By-> PlayerSpriteKasua
따라서 Spritebase.h의 구문 분석 버전은 다음과 같습니다.
class SpriteBase {
public:
//Variables=============================================
-snip-
//Primary Functions=====================================
virtual void think()=0; //Called every frame to allow the sprite to process events and react to the player.
virtual void render(long long ScreenX, long long ScreenY)=0; //Called every frame to render the sprite.
//Various overridable and not service/event functions===
virtual void died(); //Called when the sprite is killed either externally or via SpriteBase::kill().
-snip-
//======================================================
};
PlayersPriteBase.h는 다음과 같습니다.
class PlayerSpriteBase : public SpriteBase
{
public:
virtual void pose() = 0;
virtual void knockback(bool Direction) = 0;
virtual int getHealth() = 0;
};
마지막으로 PlayersPritekasua.h는 다음과 같습니다.
class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
};
나는 아직 그 안에 멤버가 없다는 것을 알고 있지만, 단순히 그것들을 추가하지 않았기 때문입니다. PlayersPriteBase도 마찬가지입니다. 그것에 갈 다른 것들이 남았습니다.
PlayersPritekasua.cpp의 코드는 다음과 같습니다.
#include "../../../MegaJul.h" //Include all the files needed in one go
void PlayerSpriteKasua::render(long long ScreenX, long long ScreenY) {
return;
}
void PlayerSpriteKasua::think() {
return;
}
int PlayerSpriteKasua::getHealth() {
return this->Health;
}
내가 입력 할 때 void PlayerSpriteKasua::
, Intellisense는 PlayersPritebase 및 Spritebase의 모든 구성원을 잘 나열하는 팝업이지만, 컴파일에서는 위에서 언급 한 것처럼 실패합니다.
이 오류가 발생한 특별한 이유가 있습니까?
PlayersPriteBase.cpp는 비어 있으며 아직 아무것도 없습니다.
Spritebase.cpp는 SpriteBase에 대한 많은 기능 정의를 가지고 있으며 PlayersPriteKasua.cpp : PlayersPriteKasua.cpp :와 동일한 형식을 사용합니다.
void SpriteBase::died() {
return;
}
예입니다.
해결책
PlayersPriteKasua.h에서는 "= 0"이 없으면 해당 메소드가 더 이상 추상적이지 않다고 말하기 위해 상체/구현하려는 모든 방법을 다시 결정해야합니다. 따라서 다음과 같이 써야합니다.
class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
virtual void think();
virtual void render(long long ScreenX, long long ScreenY);
virtual int getHealth();
};
... 아니면 게시물을 짧게 유지하기 위해 생략 했습니까?
다른 팁
클래스 정의에서 PlayersPriteKasua :: Render ()에 대한 선언을 제공해야합니다. 그렇지 않으면, PlayersPritekasua.h를 포함한 다른 번역 장치는 당신이 정의를 제공했다고 말할 수 없으며, PlayersPritekasua는 인스턴스화 할 수 없다는 결론을 내릴 것입니다.
PlayersPritekasua.h에서 PlayersPritekasua의 선언에서 PlayersPritekasua에서 구현할 Spritebase 회원을 다시 고정해야합니다.