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)(...);