0

스레드를 소유하고있는 싱글 톤에서 함수 포인터의 배열을 구현하려고합니다. 스레드 함수에서 멤버가 객체에 상대적이어야한다는 오류가 발생합니다.FunktionPointerArray in Singleton

typedef struct{ 
    int action; 
    HWND handle; 
}JOB; 

class Class{ 
public: 
    enum Action { 1,2 }; 

private: 
    JOB m_currentJob; 
    queue<JOB> Jobs; 

    static DWORD WINAPI ThreadFunction(LPVOID lpParam); 

    void (Class::*ftnptr[2])(JOB Job); 
    void Class::ftn1(JOB Job); 
    void Class::ftn2(JOB Job); 

// Singleton pattern 
public: 
    static Class* getInstance(){ 
    if(sInstance == NULL) 
     sInstance = new Class(); 
    return sInstance; 
    } 
private: 
    Class(void); 
    ~Class(void); 
    static Class* sInstance; 
}; 

바디 :

#include "Class.h" 

Class* Class::sInstance = NULL; 

Class::Class(){ 
    this->ftnptr[0] = &Class::ftn1; 
    this->ftnptr[1] = &Class::ftn2; 
} 

DWORD WINAPI Class::AutoplayerThreadFunction(LPVOID lpParam) 
{ 
    Class *pParent = static_cast<Class*>(lpParam); 

    while(true){ 
    (pParent->*ftnptr[pParent->m_currentJob.action])(pParent->m_currentJob); 
    /* The line above causes the compiler error. Curious to me is that 
    * neither "pParent->m_currentJob" nor "pParent->m_currentJob" cause 
    * any problems, although they are members too like the ftnptr array. 
    */ 
    } 
} 

void Class::ftn1(JOB Job){} 
void Class::ftn2(JOB Job){} 

SingletonPattern 나던에서의 getInstance를 통해 호출이 더 나은 그것을 만들

헤더 ... commentline 더 많은. 제안 사항이 있으십니까?

+0

그룹 문제입니까? '(pParent -> * (ftnptr [...]))'를 시도하십시오. –

+0

아니요. 그 원인은 다른 곳에 숨어있는 것 같습니다. 나는 이것을 가지고있다 : "(this -> * internalUpdate) (hWnd);" 그 코드에서 somhere. 잘 작동합니다. – ManuelSchneid3r

+0

나는 대괄호 그룹을 구체적으로 언급하고 있었다. 귀하의 반례는 관련이 없기 때문에 관련이 없습니다. –

답변

1

ftnptr는 클래스의 구성원입니다. 그러나 직접 액세스 할 수 있습니다. 즉, pParent -> * ftnptr [...]은 "포인터 ftnptr [...]"에 의해 지정된 pParent의 멤버에 액세스하는 것을 의미하지만 ftnptr도 pParent의 멤버임을 의미하지는 않습니다.

올바른 코드는 (pParent-> * (pParent-> ftnptr [...])) (...)입니다. 하지만 그 배열 색인 표현을 추출하는 것이 좋습니다 :

auto fnptr = pParent->ftnptr[...]; 
(pParent->*fnptr)(...); 
+0

끔찍하지만 매력처럼 작동합니다. – ManuelSchneid3r

0

필자는 멤버 함수에 대한 포인터 배열을 어떻게 선언 할 수 있을지 생각합니다. (편집 : 이것은 잘못된 것이 아니며 어쨌든 함수 포인터에 대한 typedef가 코드 클리너를 만들 수 있기 때문에이 답변을 보관할 것이므로 좋은 조언이라고 생각합니다.)

typedef :

typedef void (Class::*ftnptr)(JOB Job); 
ftnptr[2] fn_ptrs; 

다음과 같이 사용 :

Class::Class(){ 
    this->fn_ptrs[0] = &Class::ftn1; 
    this->fn_ptrs[1] = &Class::ftn2; 
} 

DWORD WINAPI Class::AutoplayerThreadFunction(LPVOID lpParam) 
{ 
    Class *pParent = static_cast<Class*>(lpParam); 

    while(true){ 
    (pParent->*(pParent->fn_ptrs[pParent->m_currentJob.action]))(pParent->m_currentJob); 
    /* The line above causes the compiler error. Curious to me is that 
    * neither "pParent->m_currentJob" nor "pParent->m_currentJob" cause 
    * any problems, although they are members too like the ftnptr array. 
    */ 
    } 
} 
+0

죄송합니다, Stackoverflow는 유지 보수를 위해 다운되었습니다. 나는 그것을 시험하지 않았다. 그러나 위의 anwser를 읽은 후에 나는 그것이 작동하지 않을 것이라고 생각합니다. 어쨌든 당신의 노력에 감사드립니다. – ManuelSchneid3r

+0

'typedef가 효과가있을 것이라고 확신합니다. 그러나 다른 대답이 지적한 문제를 해결하지는 못합니다 : 함수 포인터를 통해 객체의 멤버를 역 참조하려고합니다. 제 대답을하기 위해서도 똑같은 변화를 만들어야합니다. –

+0

위의 코드를 수정하는 코드를 추가했습니다. 함수 포인터에 대해'typedef '를 사용하면 코드를보다 명확하게 만들 수 있으므로 추천 할만합니다. –