2013-04-02 112 views
7

我想要以更好的方式掌握指針函數的概念。所以我有一個非常簡單的工作示例:函數指針產生'非法使用非靜態成員函數'錯誤

#include <iostream> 

using namespace std; 

int add(int first, int second) 
{ 
    return first + second; 
} 

int subtract(int first, int second) 
{ 
    return first - second; 
} 

int operation(int first, int second, int (*functocall)(int, int)) 
{ 
    return (*functocall)(first, second); 
} 

int main() 
{ 
    int a, b; 
    int (*plus)(int, int); 
    int (*minus)(int, int); 
    plus = &add; 
    minus = &subtract; 
    a = operation(7, 5, add); 
    b = operation(20, a, minus); 
    cout << "a = " << a << " and b = " << b << endl; 
    return 0; 
} 

到目前爲止好, 現在我需要組的功能的一類,然後選擇添加或基於我用的函數指針減去。所以,我只是做一個小修改爲:

#include <iostream> 

using namespace std; 

class A 
{ 
public: 
int add(int first, int second) 
{ 
    return first + second; 
} 

int subtract(int first, int second) 
{ 
    return first - second; 
} 

int operation(int first, int second, int (*functocall)(int, int)) 
{ 
    return (*functocall)(first, second); 
} 
}; 

int main() 
{ 
    int a, b; 
    A a_plus, a_minus; 
    int (*plus)(int, int) = A::add; 
    int (*minus)(int, int) = A::subtract; 
    a = a_plus.operation(7, 5, plus); 
    b = a_minus.operation(20, a, minus); 
    cout << "a = " << a << " and b = " << b << endl; 
    return 0; 
} 

和明顯的錯誤是:

ptrFunc.cpp: In function ‘int main()’: 
ptrFunc.cpp:87:29: error: invalid use of non-static member function ‘int A::add(int, int)’ 
ptrFunc.cpp:88:30: error: invalid use of non-static member function ‘int A::subtract(int, int)’ 

怎麼我還沒有指定哪個對象調用(我不想用靜態方法現在)

編輯: 一些意見和答案建議非靜態版本(因爲我已經寫的)是不可能的(感謝所有) 所以, 國防部。 ifying類以下列方式也不會工作:

#include <iostream> 

using namespace std; 

class A 
{ 
    int res; 
public: 
    A(int choice) 
    { 
     int (*plus)(int, int) = A::add; 
     int (*minus)(int, int) = A::subtract; 
     if(choice == 1) 
      res = operation(7, 5, plus); 
     if(choice == 2) 
      res = operation(20, 2, minus); 
     cout << "result of operation = " << res; 
    } 
int add(int first, int second) 
{ 
    return first + second; 
} 

int subtract(int first, int second) 
{ 
    return first - second; 
} 

int operation(int first, int second, int (*functocall)(int, int)) 
{ 
    return (*functocall)(first, second); 
} 
}; 

int main() 
{ 
    int a, b; 
    A a_plus(1); 
    A a_minus(2); 
    return 0; 
} 

生成此錯誤:

ptrFunc.cpp: In constructor ‘A::A(int)’: 
ptrFunc.cpp:11:30: error: cannot convert ‘A::add’ from type ‘int (A::)(int, int)’ to type ‘int (*)(int, int)’ 
ptrFunc.cpp:12:31: error: cannot convert ‘A::subtract’ from type ‘int (A::)(int, int)’ to type ‘int (*)(int, int)’ 

可我知道如何解決這個問題嗎?

謝謝

+0

成員函數隱式地將'this'作爲第一個參數。 –

+1

你需要讓它們變成靜態的。無論如何,它們似乎自然是靜止的。 –

+0

我會對我的問題進行更改。請看看,我會重視您的意見。謝謝 – rahman

回答

5

一個函數指針聲明到構件的方法的語法是:

int (A::*plus)(int, int) = &A::add; 
int (A::*minus)(int, int) = &A::subtract; 

要調用構件的方法使用*或 - > *運算:

(a_plus.*plus)(7, 5); 

另外看看http://msdn.microsoft.com/en-us/library/b0x1aatf(v=vs.80).aspx

希望這會有所幫助。

完整代碼:

 #include <iostream> 

    using namespace std; 

    class A 
    { 
    public: 
    int add(int first, int second) 
    { 
     return first + second; 
    } 

    int subtract(int first, int second) 
    { 
     return first - second; 
    } 

    int operation(int first, int second, int (A::*functocall)(int, int)) 
    { 
     return (this->*functocall)(first, second); 
    } 
    }; 

    int main() 
    { 
     int a, b; 
     A a_plus, a_minus; 
     int (A::*plus)(int, int) = &A::add; 
     int (A::*minus)(int, int) = &A::subtract; 
     a = a_plus.operation(7, 5, plus); 
     b = a_minus.operation(20, a, minus); 
     cout << "a = " << a << " and b = " << b << endl; 
     return 0; 
    } 
+1

添加&到聲明(不管調用)將產生相同的錯誤。 – rahman

+0

請試用上面的代碼片段。它應該工作。 – Arun

+0

它的工作原理,謝謝 – rahman

2

您不能傳遞非靜態成員函數作爲參數,很容易。並且爲了您的需要,我認爲最好是覆蓋運營商:http://www.learncpp.com/cpp-tutorial/92-overloading-the-arithmetic-operators/

但是,如果您確實需要它們作爲實際的成員函數 - 只需將它們設爲靜態。

+0

不,這不是我所需要的。我想我沒有清楚地解釋這個問題。我只會做一些改變。如果這也沒有解決辦法,請讓我知道。謝謝。 – rahman

+1

更改後我的答案仍然存在。正如Alok Save指出的那樣,成員函數仍然隱含着這個作爲第一個參數。生成的新錯誤實際上是回答您的問題:(*)(int,int)聲明不是(A ::)(int,int) - 您必須更改聲明並正確解引用它們。你可能應該告訴我們爲什麼你不能讓它們成爲靜態或者更好的原因,但是讓它們作爲重載操作符,它們的邏輯只是要求它們是靜態的:) –

1

您對代碼進行編輯仍然是錯誤的,因爲它不會使成員函數是靜態的。您需要進行加,減等靜態函數通過添加static符:

#include <iostream> 

using namespace std; 

class A 
{ 
    int res; 
public: 
    A(int choice) 
    { 
     int (*plus)(int, int) = A::add; 
     int (*minus)(int, int) = A::subtract; 
     if(choice == 1) 
      res = operation(7, 5, plus); 
     if(choice == 2) 
      res = operation(20, 2, minus); 
     cout << "result of operation = " << res; 
    } 
static int add(int first, int second) 
{ 
    return first + second; 
} 

static int subtract(int first, int second) 
{ 
    return first - second; 
} 

static int operation(int first, int second, int (*functocall)(int, int)) 
{ 
    return (*functocall)(first, second); 
} 
}; 
2

請參見下面的代碼。函數調用正在工作,不會使它們變成靜態的。

class A 
{ 
    public: 
    int add(int first, int second) 
    { 
     return first + second; 
    } 

    int subtract(int first, int second) 
    { 
     return first - second; 
    } 

    int operation(int first, int second, int(A::*functocall)(int, int)) 
    { 
     return (this->*functocall)(first, second); 
    } 
}; 
//typedef int(A::*PFN)(int, int) ; 
int main() 
{ 
    int a, b; 
    A a_plus, a_minus; 
    a = a_plus.operation(7, 5, &A::add); 
    b = a_minus.operation(20, a, &A::subtract); 
    cout << "a = " << a << " and b = " << b << endl; 
    return 0; 
} 
相關問題