2010-09-24 56 views
0

好吧,自從我用C++編寫以來已經有一段時間了。 我從來沒有做過這麼高的安靜事。傳遞函數

所以基本上我需要創建一個類。 該類的構造函數需要從另一個類的方法或函數獲取引用(或指針)。

基本上我有一個需要有時從fltk valuator(version 1.1.x)讀取值的類,然後改變一些關於它自己的東西。 每個對象都有它自己的評估器。 (他們也有一個鏈接到同一父母的另一個對象,這更新後,他們自己的價值將告訴更新,等等)

那麼我如何傳遞函數,在構造函數?

+0

你怎麼知道哪個對象調用傳入的方法?這個對象在施工過程中是否已經知道,或者稍後想要調用它? – fredoverflow 2010-09-24 07:23:55

+0

傳遞的方法不帶參數。它只是返回一個雙值,這是評估者當前設置的值。 具有我想要傳遞的方法的Valuator對象已經創建。 – 2010-09-24 07:29:42

+0

查看標準函數mem_fun和mem_fun_ref。這些可能完全符合你的要求。 – JoshD 2010-09-24 07:33:40

回答

3

這裏是哪裏的Foo的方法傳遞給Bar構造和以後調用給定Bar對象上的例子:

struct Foo 
{ 
    int z; 

    int add(int x, int y) 
    { 
     return x + y + z; 
    } 

    int mul(int x, int y) 
    { 
     return x * y * z; 
    } 
}; 

typedef int (Foo::*foo_method)(int, int); 

struct Bar 
{ 
    foo_method m; 

    Bar(foo_method m) : m(m) {} 

    int call_on(Foo* foo) 
    { 
     return (foo->*m)(4, 2); 
    } 
}; 

int main() 
{ 
    Bar bar(&Foo::add); 

    Foo foo = { 123 }; 
    bar.call_on(&foo); 
} 

如果,另一方面,你已經知道在BarFoo對象施工時間,然後Bar並不關心該方法屬於哪個類。它所需要的只是一個函子以後再調用,並且Foo對象可以簡單地被客戶端綁定。

#include <functional> 

struct Bar 
{ 
    std::function<int (int, int)> f; 

    Bar(std::function<int (int, int)> f) : f(f) {} 

    int call() 
    { 
     return f(4, 2); 
    } 
}; 

using namespace std::placeholders; 

int main() 
{ 
    Foo foo = { 123 }; 
    Bar bar(std::bind(&Foo::add, &foo, _1, _2)); 

    bar.call(); 
} 

如果你沒有的C++ 0x編譯器,與std::tr1::bindboost::bind更換std::bind

+0

這是後一種情況,不幸的是我被困在GCC 3.42中。 (dev C++),我不想更新,因爲這是我的評估者將使用的一個。 我想我會攜帶整個對象來訪問它的方法。 – 2010-09-24 08:02:54

+0

@Oxi:Bar在編譯時是否知道調用哪個'Foo'方法?在這種情況下,你根本不需要函數指針。 – fredoverflow 2010-09-24 08:33:51

1

你的構造可能是這個樣子:


// convenient typedef. This is for a pointer to a function in Foo 
// The function returns void and takes no parameters. 
typedef void (Foo::*FooPtr)(); 

class Bar { 
public: 
    Bar (FooPtr foo_ptr); 
}; 

退房有關詳細信息,有些網站引用關於語法的指針到成員。如果你先熟悉它會容易得多。

作爲補充說明,請查看函數mem_fun和mem_fun_ref。這些可能會做你所需要的。

+0

其實它可能不是一個類的成員。 它可能是一個函數,我創建的僅僅是包裝(比如說將度轉化爲弧度)。 – 2010-09-24 07:34:08

+0

@Oxi:「可能不會」 - >它實際上不是?或者你想同時允許? – fredoverflow 2010-09-24 08:25:18

1

捕獲此問題的最簡單方法是使用boost::function。它可以存儲函數指針,也可以將成員函數綁定到對象的結果。

例如,

class Foo { 
    Foo(boost::function<int(void)>); 
}; 

將讓你接受任何整數來源。