【问题标题】:C++ Function PointerC++ 函数指针
【发布时间】:2011-04-21 11:53:17
【问题描述】:

这可能吗?如果是这样,我似乎无法正确使用语法。 (C++函数指针)

一点背景。下面的代码已经为这篇文章缩短了。这种实现的原因是为了避免 SWITCH/CASE 或 IF/ELSEIF 语句的无穷列表;并拥有无穷无尽的 DECODER_FUNCTION_TABLE 列表(见下文)。此代码处理使用助记符来表示不同事物的行业标准,并且有数百个这样的助记符。所以我的这部分代码是解码从另一段代码传递给它的某些助记符,该代码段循环通过传入的记录......无论如何,我的困难在于将成员函数指针保留在类外部的结构中......

看看。我认为代码可能会更好地解释;)

typedef struct _DECODER_FUNCTION_RECS
{
  ISO_MNEMONIC_ID Mnemonic;
  void (Database::*pFn)(Database::Rec *);

}DECODER_FUNCTION_RECS;


DECODER_FUNCTION_RECS DECODER_FUNCTION_TABLE[] = {

  SFP, &Database::Decode_SFP,
  KOG, &Database::Decode_KOG
};


void Database::DecodedDescription(Rec *A)
{

  int i = 0;
  bool Found = false;

  while( i < DECODER_FUNCTION_TABLE_COUNT && !Found )
  {
    if( DECODER_FUNCTION_TABLE[i].Mnemonic == A->Mnemonic )
      Found = true;
    else
      i++;
  }

  if( Found )
    (([DECODER_FUNCTION_TABLE[i]).*this.*pFn)( A );

}


void Database::Decode_SFP(Rec *A)
{
  // do decode stuff on A
}

我要解决的细节是这一行:

 (([DECODER_FUNCTION_TABLE[i]).*this.*pFn)( A );

【问题讨论】:

标签: c++ function pointers


【解决方案1】:

你调用一个成员函数指针(这就是它的名字)

(this->*DECODER_FUNCTION_TABLE[i].pFn)(A);

可以在DECODER_FUNCTION_TABLE[i].pFn 周围加上括号,但成员访问运算符. 的优先级高于成员函数运算符-&gt;*

【讨论】:

  • 哇!快速回答! & 也绝对正确!太感谢了。也谢谢你的解释......我搞砸了成员访问运算符的优先级高于函数运算符。
  • @Eric:快吗?不,那是在你问完之后的 8 分钟。 :) 我很困惑,还没有人回答。 ;)
【解决方案2】:

我写了一些简单的例子,前几天会有所启发

在我对这个问题的回答中

error C2664 and C2597 in OpenGL and DevIL in C++

或直接link to codepad

【讨论】:

  • 谢谢!你的帖子也帮助了我的理解。