이 코드는 다른 클래스에서 상속되는 Entity.h 내에 있습니다. 아이디어는 상속 클래스에서 상속을 피하거나 동작을 수정하기 위해 함수를 변경할 수 있다는 것입니다. 나는이 물건을 배운 이후 오랜만이야, 내가 모든 것을 다시 튜토리얼을 검토 한클래스 내에서 함수 포인터를 할당하면 C++에서 값 형식 오류가 발생합니다.
Error 2 error C2440: '=' : cannot convert from 'void (__cdecl Entity::*)(void)' to 'void (__cdecl *)(void)' c:\documents and settings\administrator\my documents\visual studio 2010\projects\projectname\[projectname]\Entity.h 16 1 [projectname]
,하지만 난 일부를 볼 수 없습니다
public:
Entity(void)
{
updateFunction = emptyFunction;
};
~Entity(void);
protected:
void emptyFunction(){}
void (*updateFunction)();
문제는 내가 컴파일에이 오류가 있다는 것입니다 차이점, 무엇이 잘못 될 수 있습니까? IntelliSense는 '='기호를 실수 지점으로 사용하지 않습니다. 나는 아무것도 바라 보지 않았 으면 좋겠다.
미리 감사드립니다. 사실 updateFunction
에서
class Entity{
public:
Entity(void)
{
updateFunction = &Entity::emptyFunction;
// ...
(this->*updateFunction)(); //Call
};
~Entity(void);
protected:
void emptyFunction(){}
void (Entity::*updateFunction)();
};
가 일반 함수는 아니고, 클래스 멤버 함수의 :
보통 가상 멤버 함수 인'virtual void updateFunction() {}'만 있으면됩니다. 파생 클래스는 적합하다고 판단 할 때 재정의 할 수 있습니다. –
당신의 코드가 작동하지 않는 이유는'updateFunction'가 일반 비회원 함수에 대한 포인터 인 반면, 'emptyFunction'은 비 정적 멤버 함수입니다. 이 두 가지 유형은 상호 교환 할 수 없습니다. 구성원 함수를 자체적으로 호출 할 수 없기 때문에 개체 인스턴스를 호출해야합니다. –
@IgorTandetnik, @ IgorTandetnik, 처음에 시도했지만 런타임 오류가 발생했습니다. 프로그램 카운터 (나는 상상)가 무효화 할 때 잘못된 영역을 가리키고 있지만 나중에 함수 포인터를 사용하여 나중에 동작을 변경할 수도 있다는 것을 깨달았습니다. 한 번에 두 가지 문제를 해결합니다. 물론 내가 가장 우선적 인 일을해야한다는 것도 알고 있지만, 지금 당장 연기 할 수는 있습니다. 그 해답은이 문제를 해결했지만 다른 해답을 얻었습니다. 필요한 인스턴스에 대해서는 아무 것도 보지 못했지만 나중에 비슷한 것을 얻을 수 있다면 계속 명심하겠습니다. – user3079666