C++ Singleton中的FunktionPointerArray
我尝试在拥有线程的单例中实现函数指针数组。 在线程函数中,我得到一个错误,告诉我一个成员必须是相对于一个对象的。更多评论 标题:C++ Singleton中的FunktionPointerArray,c++,arrays,static,compiler-errors,member-function-pointers,C++,Arrays,Static,Compiler Errors,Member Function Pointers,我尝试在拥有线程的单例中实现函数指针数组。 在线程函数中,我得到一个错误,告诉我一个成员必须是相对于一个对象的。更多评论 标题: typedef struct{ int action; HWND handle; }JOB; class Class{ public: enum Action { 1,2 }; private: JOB m_currentJob; queue<JOB> Jobs; static DWORD WINAPI ThreadFu
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;
};
typedef结构{
内联作用;
HWND手柄;
}工作;
班级{
公众:
枚举操作{1,2};
私人:
作业m_currentJob;
排队作业;
静态DWORD WINAPI线程函数(LPVOID lpParam);
无效(类别::*ftnptr[2])(职务);
无效类::ftn1(作业);
无效类::ftn2(作业);
//单态模式
公众:
静态类*getInstance(){
if(sInstance==NULL)
sInstance=新类();
回归承诺;
}
私人:
类别(无效);
~Class(无效);
静态类*sInstance;
};
正文:
#包括“Class.h”
Class*Class::sInstance=NULL;
类::类(){
此->ftnptr[0]=&Class::ftn1;
this->ftnptr[1]=&Class::ftn2;
}
DWORD WINAPI类::自动层读取函数(LPVOID lpParam)
{
类*pParent=静态_铸造(lpParam);
while(true){
(pParent->*ftnptr[pParent->m_currentJob.action])(pParent->m_currentJob);
/*上面这一行导致了编译器错误。我好奇的是
*“pParent->m_currentJob”和“pParent->m_currentJob”都不会导致
*任何问题,尽管他们也是ftnptr阵列的成员。
*/
}
}
void类::ftn1(作业){}
void类::ftn2(作业){}
从SingletonPattern通过getInstance进行调用不会使它变得更好。
有什么建议吗?我想可能是您如何声明指向成员函数的指针数组。(编辑:这并不是问题所在。无论如何,我都会保留这个答案,因为函数指针的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.
*/
}
}
Class::Class(){
这->fn_ptrs[0]=&Class::ftn1;
这->fn_ptrs[1]=&Class::ftn2;
}
DWORD WINAPI类::自动层读取函数(LPVOID lpParam)
{
类*pParent=静态_铸造(lpParam);
while(true){
(pParent->*(pParent->fn_ptrs[pParent->m_currentJob.action])(pParent->m_currentJob);
/*上面这一行导致了编译器错误。我好奇的是
*“pParent->m_currentJob”和“pParent->m_currentJob”都不会导致
*任何问题,尽管他们也是ftnptr阵列的成员。
*/
}
}
ftnptr是该类的成员。但是,您可以直接访问它。也就是说,pParent->*ftnptr[…]表示“访问指针ftnptr[…]指定的pParent成员”,但这并不意味着ftnptr也是pParent的成员
正确的代码是(pParent->*(pParent->ftnptr[…])(…)。但我建议从中提取数组索引表达式:
auto fnptr = pParent->ftnptr[...];
(pParent->*fnptr)(...);
这是分组问题吗?试试
(pParent->*(ftnptr[…])
。不。原因似乎隐藏在其他地方。我有:“(this->*internalUpdate)(hWnd);”som代码中的其他地方。我特别指的是方括号的分组。你的反例不恰当,因为它没有这些。好吧,首先我误解了你。第二,我犯了一个复制粘贴错误:D。我以为你指的是圆括号。但这难道不是无关紧要的吗?我认为数组括号是最具绑定性的操作符之一。顺便说一句,在前面的例子中,我的意思是“(this->*ftnptr[gs])(JOB-JOB);”。但它的工作也很好对不起,Stackoverflow已经停止维护了。我没有测试它。但是在阅读了上面的anwser之后,我认为它不会起作用。无论如何,谢谢你的努力。我很确定typedef
会起作用。但是,它无法解决另一个答案指出的问题:试图通过函数指针取消对对象成员的引用。要使我的答案有效,您必须进行相同的更改。我添加了代码以使上述代码正确。对函数指针使用typedef
确实可以使代码更干净,所以我强烈推荐它。
auto fnptr = pParent->ftnptr[...];
(pParent->*fnptr)(...);