2016-03-15 109 views
0

我是通過函數指針。通過函數指針作爲參數的另一個函數的參數

下面是一個例子代碼:

#include <iostream> 

class test 
{ 

    inline 
    void output_plumber_1(int* const arg_out, const int* const arg_in) 
    { 
     *arg_out = -*arg_in; 
    } 

    inline 
    void input_plumber_1(int* const arg_out, const int* const arg_in) 
    { 
     *arg_out = 2 * (*arg_in); 
    } 

    inline 
    void member_func(void (test::*output_plumber)(int* const arg_out, const int* const arg_in), 
        void (test::*input_plumber)(int* const arg_out, const int* const arg_in), 
        int arg) 
    { 

     int arg_copy; 
     (*input_plumber)(&arg_copy, &arg); 

     arg_copy = arg_copy + 1; 

     int arg_out; 
     (*output_plumber)(&arg_out, &arg_copy); 

     std::cout << arg_out << std::endl; 

    } 

public: 

    void execute(int arg) 
    { 
     void (test::*output_plumber)(int* const arg_out, const int* const arg_in) = &test::output_plumber_1; 
     void (test::*input_plumber)(int* const arg_out, const int* const arg_in) = &test::input_plumber_1; 

     member_func(output_plumber, input_plumber, arg); 
    } 


}; 


int main() 
{ 

    test mytest; 
    mytest.execute(1); 

    return 0; 

} 

什麼是應該做

這是一個相當精益的例子,但本質上我有一個帶有一個成員函數的類的程序,它對一些輸入數據進行操作。在執行操作之前以及在執行操作之後,必須將數據輸入到一組輸入和輸出「管道工」功能中,這些功能修改數據以準備「操作」發生,並且「做一些事情來糾正在「手術發生後」進行初步準備「。

這樣的事情出現在我的程序中,因爲我正在處理只對x> y有效的數據對(x,y)進行操作的算法。 (奇怪的?但是,這是怎麼回事。)

什麼問題

推測衆多,但是立即編譯器輸出如下:

main.cpp: In member function ‘void test::member_func(void (test::*)(int*, const int*), void (test::*)(int*, const int*), int)’: 
main.cpp:27:11: error: invalid use of unary ‘*’ on pointer to member 
     (*input_plumber)(&arg_copy, &arg); 
     ^
main.cpp:32:11: error: invalid use of unary ‘*’ on pointer to member 
     (*output_plumber)(&arg_out, &arg_copy); 
+0

問題:「這是怎麼回事de做「或」爲什麼不編碼「? –

+0

@JamesRoot爲什麼不編譯 - 我自己編寫代碼,我知道我想要它做什麼,它只是在語法上不正確 – user3728501

+0

如果管道工函數實際上不使用'this',那最好是讓他們成爲非會員。考慮讓'member_func'接受更通用的'std :: function ''。 –

回答

3

此:

void (test::*output_plumber)(int* const arg_out, const int* const arg_in) 

是指向的test的成員函數,它採用兩個參數,並返回void。指向成員的指針只是指向給定的成員變量或函數,但在類的上下文之外沒有任何意義。所以你不能在沒有實例的情況下調用它。

兩個允許的語法是:

(obj.*ptr)(args...) 
(p_obj->*ptr)(args...) 

取決於實例是否是一個指針。所以,正確的語法來調用你的指針是:

(this->*input_plumber)(&arg_copy, &arg); 
(this->*output_plumber)(&arg_out, &arg_copy); 

和正確的方法來調用你的函數是:

test_obj.member_func(&test::output_plumber_1, // <-- pointer to member 
    &test::input_plumber_1,     // <-- pointer to member 
    0); 
1
void (test::*input_plumber)(int* const arg_out, const int* const arg_in), 

根據您的問題,您似乎認爲,上面聲明瞭一個函數指針的參數。

那麼,以上不是函數指針。這是一個類方法指針。這與函數指針不同。

您不能調用input水暖工,如果它是一個函數指針:

(*input_plumber)(&arg_copy, &arg); 

你不能這樣做,因爲這是不是一個函數指針。我提到過,這不是一個函數指針,而是一個類方法指針?是的,我想我是。

要調用方法指針,假定這是你想要做的事情,你必須通過方法指針找到你希望調用其方法的類的實例。

(this->*input_plumber)(&arg_copy, &arg); 

現在,如果你有一些其他指針test,躺在身邊,例如:

test *some_ptr_to_test; 

你會援引要調用this的方法

Asusming對象的方法指針類似:

(test->*input_plumber)(&arg_copy, &arg); 
+0

他們被稱爲「成員函數指針」。與C#,Java,Python等不同,C++中沒有「方法」的具體含義。 –

+0

'test - > *'應該是'some_ptr_to_test - > *' –