2016-09-03 8 views
-2

그래서 "Script"라는 기본 클래스에서 파생 된 "TestScript"라는 클래스가 있습니다. "Script"에는 generic 포인터 인 parent라는 멤버가 있습니다. "TestScript"에서 "parentObj"라는 유형의 "GameObject"멤버가 있습니다.파생 된 클래스에서 캐스트 된 일반 포인터의 멤버에 액세스 위반이 발생한다

그래서 "Script"기본 클래스에서 "parentObj"멤버로 일반 포인터를 캐스팅하고 해당 "GameObject"멤버가 있지만 액세스 위반이 발생하면 액세스합니다.

나는 코드를 밟았으며 "GameObject"유형의 "name"멤버에 액세스하는 줄이 오류가 발생한 위치임을 확인했습니다.

"스크립트"클래스 정의 ("Objects.cpp"에서) :

class Script 
{ 
public: 
    void* parent = NULL; // The generic pointer 
    virtual void Initialize() {} // Not used 
    virtual void Update() {} 
    virtual void OnDestruction() {} // Also not used 
}; 

"TestScript"클래스 정의 :

#include "Objects.cpp" 

class TestScript : public Script 
{ 
public: 
    GameObject *parentObj = static_cast<GameObject*>(parent); // Casting... 
    TestScript() {} 
    void Update() override 
    { 
     std::cout << parentObj->name << std::endl; // Access violation here. 
    } 
}; 

은 "게임 오브젝트 여기

코드입니다 "형식도"Objects.cpp "에 정의되어 있습니다.

일반 포인터는 자동으로"Gam eObject " 키워드를 사용하여 이미 선언 된"GameObject "의 어딘가에 있습니다.

+2

이러한 문제를 해결하는 올바른 도구는 디버거 : 실행

함수를 사용하는 것이 좋습니다 (내가 잘못 아니에요 경우, 기본 생성자 후에 실행하고 이전에 파생 클래스의 ctor 것). 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –

+1

널 포인터 멤버에 액세스하면 오류가 발생한다는 사실에 놀라지 않습니다. – IllidanS4

+0

@ IllidanS4 당신은 질문을 좀 더 철저하게 읽어야합니다. 포인터가 "GameObject"유형의 개체로 설정되었다고 말하면서 아래쪽에서 (어쩌면 내가 올바르게 말하지 않았을 수도 있습니다). –

답변

0

코드 뒤에 GameObject *parentObj = static_cast<GameObject*>(parent); "parent"값을 설정했을 수 있습니다.

GameObject* GetparentObj() 
{ 
    return static_cast<GameObject*>(parent); 
}