如何调用指向已保存在自定义结构向量中的成员函数的指针?
How to call pointer to member function, which has been saved in a vector of custom struct?
我的问题实际上是关于 already asked question. I have tried the answer given by @r3mus n0x 也看到了一些 SO 问题,这些问题并没有帮助我清楚地了解上述情况。
在给定的 post 中缺少 MCVE,因此我尝试了一下并提出了以下代码,并且出现了与 @user10213044 在 his/her post 中提到的相同的错误。
error C2065: 'm_func': undeclared identifier
我的问题:
Q1:我们真的可以将指向 class 的某些成员函数的指针(如下例所示)存储到它的私有成员(例如.向量数组)?如果是这样,出现上述错误消息的原因是什么?
Q2: 我也试过在for循环里面写:
classFuncPtr fun = bindClassPtr->m_func; // compiles
fun(str); // error
给我:Error msg
error: must use '.*' or '->*' to call pointer-to-member function in 'fun (...)', e.g. '(... ->* fun) (...)'
fun(str); // error
我无法理解。谁能告诉我这种情况出了什么问题?
第二次尝试类似于我们用于普通函数指针情况的以下情况。
typedef void(*FuncPtr)(const std::string&);
FuncPtr Lambda = [](const std::string& str) { std::cout << str << std::endl; };
Lambda(std::string("Hellow World"));
这是我试过的代码:
#include <iostream>
#include <vector>
#include <string>
#include <memory>
class MyClass;
typedef void (MyClass::*classFuncPtr)(const std::string&); // function ptr to MyClass::member functions
struct MyBind // bind struct
{
classFuncPtr m_func;
explicit MyBind(const classFuncPtr& func): m_func(std::move(func)) {}
};
class MyClass
{
std::string m_var;
std::vector<std::unique_ptr<MyBind>> my_binds_;
public:
MyClass() // constructor
{
my_binds_.emplace_back( std::make_unique<MyBind>( std::move(&MyClass::do_this) ));
my_binds_.emplace_back( std::make_unique<MyBind>( std::move(&MyClass::do_that) ));
}
// two functions to bind
void do_this (const std::string& str) { std::cout << "From do this: " << str << std::endl; }
void do_that (const std::string& str) { std::cout << "From do that: " << str << std::endl; };
void handle_input(const std::string& str)
{
for (const std::unique_ptr<MyBind>& bindClassPtr: my_binds_)
{
// how to print passed string str here?? (Q1)
(bindClassPtr->*m_func)(str);
/*
classFuncPtr fun = bindClassPtr->m_func; // compiles (Q2)
fun(str); // error
*/
}
}
};
您的第一次尝试失败,因为在名为 m_func
.
的范围内没有变量
您的第二次尝试失败,因为指向成员的指针需要调用对象。
正确的语法是:
classFuncPtr fun = bindClassPtr->m_func;
(this->*fun)(str);
您的 MyBind
对象中包含的指针实际上并未绑定到任何对象。它是指向 MyClass
成员的指针,因此您必须为其提供 MyClass
的实例才能继续工作。
我的问题实际上是关于 already asked question. I have tried the answer given by @r3mus n0x 也看到了一些 SO 问题,这些问题并没有帮助我清楚地了解上述情况。
在给定的 post 中缺少 MCVE,因此我尝试了一下并提出了以下代码,并且出现了与 @user10213044 在 his/her post 中提到的相同的错误。
error C2065: 'm_func': undeclared identifier
我的问题:
Q1:我们真的可以将指向 class 的某些成员函数的指针(如下例所示)存储到它的私有成员(例如.向量数组)?如果是这样,出现上述错误消息的原因是什么?
Q2: 我也试过在for循环里面写:
classFuncPtr fun = bindClassPtr->m_func; // compiles
fun(str); // error
给我:Error msg
error: must use '.*' or '->*' to call pointer-to-member function in 'fun (...)', e.g. '(... ->* fun) (...)'
fun(str); // error
我无法理解。谁能告诉我这种情况出了什么问题?
第二次尝试类似于我们用于普通函数指针情况的以下情况。
typedef void(*FuncPtr)(const std::string&);
FuncPtr Lambda = [](const std::string& str) { std::cout << str << std::endl; };
Lambda(std::string("Hellow World"));
这是我试过的代码:
#include <iostream>
#include <vector>
#include <string>
#include <memory>
class MyClass;
typedef void (MyClass::*classFuncPtr)(const std::string&); // function ptr to MyClass::member functions
struct MyBind // bind struct
{
classFuncPtr m_func;
explicit MyBind(const classFuncPtr& func): m_func(std::move(func)) {}
};
class MyClass
{
std::string m_var;
std::vector<std::unique_ptr<MyBind>> my_binds_;
public:
MyClass() // constructor
{
my_binds_.emplace_back( std::make_unique<MyBind>( std::move(&MyClass::do_this) ));
my_binds_.emplace_back( std::make_unique<MyBind>( std::move(&MyClass::do_that) ));
}
// two functions to bind
void do_this (const std::string& str) { std::cout << "From do this: " << str << std::endl; }
void do_that (const std::string& str) { std::cout << "From do that: " << str << std::endl; };
void handle_input(const std::string& str)
{
for (const std::unique_ptr<MyBind>& bindClassPtr: my_binds_)
{
// how to print passed string str here?? (Q1)
(bindClassPtr->*m_func)(str);
/*
classFuncPtr fun = bindClassPtr->m_func; // compiles (Q2)
fun(str); // error
*/
}
}
};
您的第一次尝试失败,因为在名为 m_func
.
您的第二次尝试失败,因为指向成员的指针需要调用对象。
正确的语法是:
classFuncPtr fun = bindClassPtr->m_func;
(this->*fun)(str);
您的 MyBind
对象中包含的指针实际上并未绑定到任何对象。它是指向 MyClass
成员的指针,因此您必须为其提供 MyClass
的实例才能继续工作。