FunktionPointerArray в синглтоне

Я пытаюсь реализовать массив указателей на функции в синглтоне, владеющем потоком.
В функции потока я получаю сообщение об ошибке, говорящее, что член должен быть относительно объекта. Больше в комментариях …

Заголовок:

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){}

Вызов через getInstance из SingletonPattern не делает его лучше.
Какие-либо предложения?

0

Решение

ftnptr является членом класса. Однако вы получаете к нему доступ напрямую. То есть pParent -> * ftnptr […] означает «доступ к члену pParent, указанному указателем ftnptr […]», но это не означает, что ftnptr также является членом pParent.

Правильный код (pParent -> * (pParent-> ftnptr […])) (…). Но я бы рекомендовал извлечь выражение индекса массива из этого:

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

Другие решения

Я думаю, что это может быть, как вы объявляете свой массив функций указателя на член. (Правка: это было не то, что было неправильно. В любом случае я продолжаю этот ответ, потому что typedefs для указателей на функции действительно может сделать код чище, поэтому я думаю, что это хороший совет.)

Попробуйте использовать 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

По вопросам рекламы [email protected]