簡體   English   中英

我可以這樣使用mem_fun嗎?

[英]can i use mem_fun like this?

我想在運行時設置函數指針。 但是我被困在這里。 當我使用全局函數或靜態類成員函數時,一切正常。 但是,當函數是普通的類成員函數時。 我總是遇到編譯器錯誤。 這是代碼:

class A   
{
    int val;
public:
    A() { val = 0; }
    A(int j) { val = j; }

    int aFun(int k) {val -= k; return val; }
};

typedef int (* func)(int );
class B
{
    func m_addr;
public:
    B(func param)
        : m_addr(param)
    {

    }
    void execute()
    {
        cout << m_addr(9) << endl;
    }
};

我正在嘗試像這樣使用它們:

/ *錯誤C2355:“ this”:只能在非靜態成員函數內部引用錯誤C2064:term的結果不等於接受1個參數的函數類未定義'operator()'或用戶定義的轉換運算符帶有適當數量參數的函數指針或函數引用* /

A a;
B b(A::aFun); 
b.execute();

大量搜索之后,我發現std::mem_fun可能會有所幫助。 但我不知道如何使用它。 有人可以幫助我嗎?

PS:我正在使用Visual C ++ 2010

類成員函數通過調用編譯器傳遞給它的一個額外的參數this ,所以編譯器看到aFun作為開始申報並寫成

int A::aFun(A* this, int k)
{
    this->val -= k;
    return this->val;
}

靜態/全局函數沒有此參數,因此編譯成功。

為了使用A::aFun您需要在某處創建類A的實例。

修改如下:

static int val;

class A   
{

public:
    A() { val = 0; }
    A(int j) { val = j; }

  static  int aFun(int k) {val -= k; return val; }
};

我沒有確切地知道您要做什么,但我看到一個錯誤,也許可以為您提供幫助。

那是一個指向函數的指針,不是嗎?

 typedef int (* func)(int );

但是您沒有函數,卻有一個類的方法。 (成員函數)所以typedef應該是概率:

typedef int (A::*func)(int );

希望對您有所幫助,您可以在google上找到指向成員函數的指針,並且會找到一些示例。

祝好運!

暫無
暫無

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

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