簡體   English   中英

如何調用成員函數指針?

[英]How do I call a pointer-to-member-function?

我收到一個我不明白的編譯錯誤(MS VS 2008)。 弄亂了好幾個小時之后,一切都變得模糊了,我覺得我很想念(很愚蠢)。 這是基本代碼:

typedef int (C::*PFN)(int);

struct MAP_ENTRY
    {
    int id;
    PFN pfn;
    };

class C
    {
    ...
    int Dispatch(int, int);
    MAP_ENTRY *pMap;
    ...
    };

int C::Dispatch(int id, int val)
    {
    for (MAP_ENTRY *p = pMap; p->id != 0; ++p)
        {
        if (p->id == id)
            return p->pfn(val);  // <--- error here
        }
    return 0;
    }

編譯器在箭頭處聲明“該項不等於帶有1個參數的函數”。 為什么不? PFN被原型化為帶有一個參數的函數,而MAP_ENTRY.pfn是PFN。 我在這里想念什么?

p->pfn是指向成員函數類型的指針。 為了通過這樣的指針調用函數,您需要使用operator- ->*或operator .*並提供C類型的對象作為左操作數。 你沒有

我不知道應該在這里使用哪個C類型的對象-只有您知道-但在您的示例中可能是 *this 在這種情況下,呼叫可能如下所示

(this->*p->pfn)(val)

為了使它看起來更容易混淆,您可以引入一個中間變量

PFN pfn = p->pfn;
(this->*pfn)(val);

嘗試

return (this->*p->pfn)(val);

只是為了親身體驗,我遇到了由以下語句引起的g ++錯誤:

  (this -> *stateHandler)() ;

其中stateHandler是指向* this引用的類的void成員函數的指針。 該問題是由箭頭運算符之間的空格引起的。 以下代碼片段可以正常編譯:

(this->*stateHandler)() ;

我正在使用g ++(GCC)4.4.2 20090825(預發行版)。 FWIW。

p-> pfn是一個函數指針。 您需要使用*使其起作用。 改成

(*(p->pfn))(val)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM