指向 class 成员函数的指针发生类型转换错误
Type conversion error in pointer to class member function
您好,这是 this previous question i did
的更新
我试图通过 class 中的指针执行函数(class 内容与我遇到的问题无关)。
这是post上一个问题的代码:
错误信息:
cannot convert ‘Clip::func’ from type ‘void (Clip::)(std::string) {aka void (Clip::)(std::basic_string<char>)}’ to type ‘callback {aka void (*)(std::basic_string<char>)}’
Clip.h
void func(string str){
cout << str << endl;
}
Clip.cpp
void Clip::update(){
typedef void(*callback)(string);
callback callbackFunction = func;
callbackFunction("called");
}
------我找到的解决方案------
我和一个朋友进行了一些快速研究,以找到解决这种情况的方法,这就是我们的发现。尽管这行得通,但我们对所涉及的表达式有一些疑问(post 末尾的问题)
Clip.h
typedef void (Clip::*Callback) (string);
void func(string _val);
Clip.cpp
void Clip::update(){
Callback function;
function = &Clip::func;
(this->*function)("a");
}
问题:
a- 在之前的 post @tkausl 回答:“...成员函数指针与(非成员)函数指针不兼容”。这就是其他代码在任何 class 中不起作用的原因吗(即使 class 完全是空的)?
b- 如果我们已经在 Clip class 中,为什么有必要像这样声明指针:Clip::*Callback?
c- 这个表达式是什么意思?: this->*function
d- 对于同样的要求,是否有更简单的方法或表达方式?
提前致谢。
你确实遇到过pointers to member functions。它们与普通函数指针相似,但更细微差别,因为(非静态)成员函数总是隐式地有一个特殊的 this
参数传递给它们,该参数引用当前调用函数的对象。根据包含该函数的 class,该秘密 this
参数是强类型的。这就是为什么 class 名称也是指向成员函数类型的指针的一部分的原因。这也是它们不与常规函数指针混合的原因。这是一个基本示例:
// Declaration of a pointer to member function
// Note that no object is used here
void (ClassName::*my_fn_pointer)(ParameterTypes);
// Assignment also doesn't use an object
my_pointer = &ClassName::exampleMemberFunction;
// But to invoke the method, you need an object
ClassName obj;
(obj::*my_fn_pointer)(example_params);
// Alternatively, inside a member function of ClassName:
(this->*my_fn_pointer)(example_params);
有很多选择。我看不到您的其余代码以及您要解决的问题,因此我的建议很有限。但是我会赞同使用 std::function
with lambdas:
// std::function generically wraps a callable type
std::function<void(ParamTypes)> my_fn;
// Using an object:
ClassName obj;
// lambda declaration
my_fn = [&obj](ParamTypes params){
// 'obj' is captured by reference, so make sure it stays alive as long as needed
obj.chooseYourMemberFunctionHere(params);
};
// function is called here, syntax is easier on the eyes
my_fn(example_params);
// Using 'this' inside a member function:
my_fn = [this](ParamTypes params){
// 'this' is captured by reference
// also make sure the current object stays alive alive as long as needed
this->chooseYourMemberFunctionHere(params);
};
my_fn(example_params); // function is called here
一个
这与您在哪里编写代码无关。成员函数指针和函数指针是两种不同类型的指针。您的代码不起作用,因为您无法将成员函数指针分配给普通函数指针。如果可以考虑这段代码,它的输出应该是什么?
class Foo
{
public:
Foo(int x) :x(x) {}
void bar(int y)
{
std::cout << x+y;
}
int x;
}
int main()
{
typedef void(*callback)();
callback ptr = &Foo::bar;//Won't compile with same error as in your question
ptr(5);
}
没有 Foo
的实例,因此没有要打印的 x
。与 C# 不同,C++ 不会让您捕获 this
,因此 Foo f; callback ptr = &f::bar
也不会编译。你可以认为 Foo::bar
等同于
void bar(Foo* this,int y)
{
std::cout<< this->x+y;
}
现在你看到那些函数类型真的很不一样了。
乙
从上面的bar
翻译可以看出,必须指定this
的类型,无论您在哪里编写该代码都没有关系。
C
调用成员函数是通过->*
运算符完成的,它的左边就是缺少的this
指针,右边是成员函数指针变量和参数。参见:
Foo foo;
typedef void(Foo::callback)(int);//Member pointer
callback ptr = &Foo::bar;//Now OK
Foo* thisFoo = &foo;//Left-hand side must be a pointer to Foo
(thisFoo->*ptr)(5);//equivalent to foo->bar(5);
this->*function
就是调用一个存储在function
变量中的成员函数,并使用this
指针作为实例。
D
什么要求?无法完成转换。如果您知道每时每刻都只会为每种类型分配一个回调,那么模板函数和局部静态变量有一种 hacky 方法可以工作。否则尽量不要使用它们,有 lambda 和可用的 std::function
更安全的替代方法,可以以 c# 方式绑定 this
。 link
您好,这是 this previous question i did
的更新我试图通过 class 中的指针执行函数(class 内容与我遇到的问题无关)。
这是post上一个问题的代码:
错误信息:
cannot convert ‘Clip::func’ from type ‘void (Clip::)(std::string) {aka void (Clip::)(std::basic_string<char>)}’ to type ‘callback {aka void (*)(std::basic_string<char>)}’
Clip.h
void func(string str){
cout << str << endl;
}
Clip.cpp
void Clip::update(){
typedef void(*callback)(string);
callback callbackFunction = func;
callbackFunction("called");
}
------我找到的解决方案------
我和一个朋友进行了一些快速研究,以找到解决这种情况的方法,这就是我们的发现。尽管这行得通,但我们对所涉及的表达式有一些疑问(post 末尾的问题)
Clip.h
typedef void (Clip::*Callback) (string);
void func(string _val);
Clip.cpp
void Clip::update(){
Callback function;
function = &Clip::func;
(this->*function)("a");
}
问题:
a- 在之前的 post @tkausl 回答:“...成员函数指针与(非成员)函数指针不兼容”。这就是其他代码在任何 class 中不起作用的原因吗(即使 class 完全是空的)?
b- 如果我们已经在 Clip class 中,为什么有必要像这样声明指针:Clip::*Callback?
c- 这个表达式是什么意思?: this->*function
d- 对于同样的要求,是否有更简单的方法或表达方式?
提前致谢。
你确实遇到过pointers to member functions。它们与普通函数指针相似,但更细微差别,因为(非静态)成员函数总是隐式地有一个特殊的 this
参数传递给它们,该参数引用当前调用函数的对象。根据包含该函数的 class,该秘密 this
参数是强类型的。这就是为什么 class 名称也是指向成员函数类型的指针的一部分的原因。这也是它们不与常规函数指针混合的原因。这是一个基本示例:
// Declaration of a pointer to member function
// Note that no object is used here
void (ClassName::*my_fn_pointer)(ParameterTypes);
// Assignment also doesn't use an object
my_pointer = &ClassName::exampleMemberFunction;
// But to invoke the method, you need an object
ClassName obj;
(obj::*my_fn_pointer)(example_params);
// Alternatively, inside a member function of ClassName:
(this->*my_fn_pointer)(example_params);
有很多选择。我看不到您的其余代码以及您要解决的问题,因此我的建议很有限。但是我会赞同使用 std::function
with lambdas:
// std::function generically wraps a callable type
std::function<void(ParamTypes)> my_fn;
// Using an object:
ClassName obj;
// lambda declaration
my_fn = [&obj](ParamTypes params){
// 'obj' is captured by reference, so make sure it stays alive as long as needed
obj.chooseYourMemberFunctionHere(params);
};
// function is called here, syntax is easier on the eyes
my_fn(example_params);
// Using 'this' inside a member function:
my_fn = [this](ParamTypes params){
// 'this' is captured by reference
// also make sure the current object stays alive alive as long as needed
this->chooseYourMemberFunctionHere(params);
};
my_fn(example_params); // function is called here
一个
这与您在哪里编写代码无关。成员函数指针和函数指针是两种不同类型的指针。您的代码不起作用,因为您无法将成员函数指针分配给普通函数指针。如果可以考虑这段代码,它的输出应该是什么?
class Foo
{
public:
Foo(int x) :x(x) {}
void bar(int y)
{
std::cout << x+y;
}
int x;
}
int main()
{
typedef void(*callback)();
callback ptr = &Foo::bar;//Won't compile with same error as in your question
ptr(5);
}
没有 Foo
的实例,因此没有要打印的 x
。与 C# 不同,C++ 不会让您捕获 this
,因此 Foo f; callback ptr = &f::bar
也不会编译。你可以认为 Foo::bar
等同于
void bar(Foo* this,int y)
{
std::cout<< this->x+y;
}
现在你看到那些函数类型真的很不一样了。
乙
从上面的bar
翻译可以看出,必须指定this
的类型,无论您在哪里编写该代码都没有关系。
C
调用成员函数是通过->*
运算符完成的,它的左边就是缺少的this
指针,右边是成员函数指针变量和参数。参见:
Foo foo;
typedef void(Foo::callback)(int);//Member pointer
callback ptr = &Foo::bar;//Now OK
Foo* thisFoo = &foo;//Left-hand side must be a pointer to Foo
(thisFoo->*ptr)(5);//equivalent to foo->bar(5);
this->*function
就是调用一个存储在function
变量中的成员函数,并使用this
指针作为实例。
D
什么要求?无法完成转换。如果您知道每时每刻都只会为每种类型分配一个回调,那么模板函数和局部静态变量有一种 hacky 方法可以工作。否则尽量不要使用它们,有 lambda 和可用的 std::function
更安全的替代方法,可以以 c# 方式绑定 this
。 link