gpt4 book ai didi

c++ - 单例中的 FunktionPointerArray

转载 作者:行者123 更新时间:2023-11-28 07:55:01 24 4
gpt4 key购买 nike

我尝试在拥有线程的单例中实现函数指针数组。在线程函数中我得到一个错误,告诉我一个成员必须相对于一个对象。更多内容在评论区...

标题:

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 调用并没有使它变得更好。有什么建议吗?

最佳答案

ftnptr 是类的成员。但是,您可以直接访问它。也就是说,pParent->*ftnptr[...] 表示“访问指针 ftnptr[...] 指定的 pParent 成员”,但并不意味着 ftnptr 也是 pParent 的成员。

正确的代码是 (pParent->*(pParent->ftnptr[...]))(...)。但我建议从中提取数组索引表达式:

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

关于c++ - 单例中的 FunktionPointerArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12874494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com