2015-01-01 2 views
0

이 코드는 다른 클래스에서 상속되는 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)(); 
}; 

가 일반 함수는 아니고, 클래스 멤버 함수의 :

+2

보통 가상 멤버 함수 인'virtual void updateFunction() {}'만 있으면됩니다. 파생 클래스는 적합하다고 판단 할 때 재정의 할 수 있습니다. –

+2

당신의 코드가 작동하지 않는 이유는'updateFunction'가 일반 비회원 함수에 대한 포인터 인 반면, 'emptyFunction'은 비 정적 멤버 함수입니다. 이 두 가지 유형은 상호 교환 할 수 없습니다. 구성원 함수를 자체적으로 호출 할 수 없기 때문에 개체 인스턴스를 호출해야합니다. –

+0

@IgorTandetnik, @ IgorTandetnik, 처음에 시도했지만 런타임 오류가 발생했습니다. 프로그램 카운터 (나는 상상)가 무효화 할 때 잘못된 영역을 가리키고 있지만 나중에 함수 포인터를 사용하여 나중에 동작을 변경할 수도 있다는 것을 깨달았습니다. 한 번에 두 가지 문제를 해결합니다. 물론 내가 가장 우선적 인 일을해야한다는 것도 알고 있지만, 지금 당장 연기 할 수는 있습니다. 그 해답은이 문제를 해결했지만 다른 해답을 얻었습니다. 필요한 인스턴스에 대해서는 아무 것도 보지 못했지만 나중에 비슷한 것을 얻을 수 있다면 계속 명심하겠습니다. – user3079666

답변

2

당신은 같은 포인터 기능을 decalre해야합니다.

+0

다음 질문을 볼 수 있습니다. 실제로 그 thang을 호출하는 방법은 다음과 같습니다. -P ... –

+0

@ πάνταῥεῖ 답변이 수정되었습니다. – Emadpres

+1

@ πάνταῥεῖ 글쎄, 나는 그것을 부르면 오류가 발생한다. P는 오류를 읽는다. "오류 오류 C2064 : 용어가 0 인수를 취하는 함수로 평가되지 않는다."InteliSense는 " (pointer-to-) function type "이라고 불렀다. 그래서 어떻게 호출 할까? 나는 derefferencer를 시도했지만 그럴 필요가 대답이 아니다 ... – user3079666