我在尝试将函数作为参数传递给另一个对象的函数时遇到了问题。我很清楚有很多类似的主题,但我要么无法让他们的解决方案起作用,要么无法理解它们。
class foo
{
public:
void func1(void (*Drawing)(void));
template<class T>
void func2(void (T::*Drawing)(void));
};
class bar
{
private:
foo myFoo;
void Drawing();
void func3() {
// Attempt 1
myFoo.func1(Drawing);
// Attempt 2
myFoo.func2<bar>(&bar::Drawing);
}
};
所以在我的第一次尝试中,我得到了错误,你可以将void (bar::*)(void)
转换为void (*)(void)
,然后我发现它有正常的函数指针和成员函数指针。
尝试2是我努力克服这个问题,但我现在得到了未解决的外部...
那么如何才能成功将Drawing()
成员函数从另一个对象传递到另一个函数?
答案 0 :(得分:5)
问题在于您不能将bar::Drawing
视为void (*)(void)
函数,因为它是非静态方法,因此需要一个对象(将使用this
上下文)
一个解决方案,假设c ++ 11对你来说没问题,那就是使用std::bind
并轻松修改你的foo定义:
class foo
{
public:
void func1(std::function<void(void)> Drawing)
{
Drawing(); // or do whatever you want with it
}
};
然后你就可以了
void bar::func3() {
myFoo.func1(std::bind(&bar::Drawing, this));
}
使许多潜在用途有效
int main()
{
bar myBar;
myBar.func3();
foo myFoo;
myFoo.func1([](){ printf("test\n"); });
return 0;
}
答案 1 :(得分:0)
我猜你已经遗漏了关于你想要完成什么的重要细节。但是,以下内容可以让您了解自己需要做些什么。
#include <iostream>
class foo
{
public:
void func1(void (*Drawing)(void))
{
std::cout << "func1\n";
}
template<class T>
void func2(T* instance, void (T::*fn)(void))
{
std::cout << "func2: ";
(instance->*fn)();
}
};
class bar
{
public:
bar()
{
func3();
}
private:
foo myFoo;
void Drawing()
{
std::cout << "bar::Drawing()\n";
}
void func3()
{
// Attempt 1
//myFoo.func1(Drawing); // This won't work
// Attempt 2
myFoo.func2(this, &bar::Drawing); // Must pass an object instance if you plan to use the member function
}
};
int main(int argc, char *argv[])
{
bar b;
return 0;
}
func2: bar::Drawing()