好吧,自從我用C++編寫以來已經有一段時間了。 我從來沒有做過這麼高的安靜事。傳遞函數
所以基本上我需要創建一個類。 該類的構造函數需要從另一個類的方法或函數獲取引用(或指針)。
基本上我有一個需要有時從fltk valuator(version 1.1.x)讀取值的類,然後改變一些關於它自己的東西。 每個對象都有它自己的評估器。 (他們也有一個鏈接到同一父母的另一個對象,這更新後,他們自己的價值將告訴更新,等等)
那麼我如何傳遞函數,在構造函數?
好吧,自從我用C++編寫以來已經有一段時間了。 我從來沒有做過這麼高的安靜事。傳遞函數
所以基本上我需要創建一個類。 該類的構造函數需要從另一個類的方法或函數獲取引用(或指針)。
基本上我有一個需要有時從fltk valuator(version 1.1.x)讀取值的類,然後改變一些關於它自己的東西。 每個對象都有它自己的評估器。 (他們也有一個鏈接到同一父母的另一個對象,這更新後,他們自己的價值將告訴更新,等等)
那麼我如何傳遞函數,在構造函數?
這裏是哪裏的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);
}
如果,另一方面,你已經知道在Bar
的Foo
對象施工時間,然後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::bind
或boost::bind
更換std::bind
。
這是後一種情況,不幸的是我被困在GCC 3.42中。 (dev C++),我不想更新,因爲這是我的評估者將使用的一個。 我想我會攜帶整個對象來訪問它的方法。 – 2010-09-24 08:02:54
@Oxi:Bar在編譯時是否知道調用哪個'Foo'方法?在這種情況下,你根本不需要函數指針。 – fredoverflow 2010-09-24 08:33:51
你的構造可能是這個樣子:
// 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。這些可能會做你所需要的。
其實它可能不是一個類的成員。 它可能是一個函數,我創建的僅僅是包裝(比如說將度轉化爲弧度)。 – 2010-09-24 07:34:08
@Oxi:「可能不會」 - >它實際上不是?或者你想同時允許? – fredoverflow 2010-09-24 08:25:18
捕獲此問題的最簡單方法是使用boost::function
。它可以存儲函數指針,也可以將成員函數綁定到對象的結果。
例如,
class Foo {
Foo(boost::function<int(void)>);
};
將讓你接受任何整數來源。
你怎麼知道哪個對象調用傳入的方法?這個對象在施工過程中是否已經知道,或者稍後想要調用它? – fredoverflow 2010-09-24 07:23:55
傳遞的方法不帶參數。它只是返回一個雙值,這是評估者當前設置的值。 具有我想要傳遞的方法的Valuator對象已經創建。 – 2010-09-24 07:29:42
查看標準函數mem_fun和mem_fun_ref。這些可能完全符合你的要求。 – JoshD 2010-09-24 07:33:40