Como chamar o ponteiro para a função de membro, que foi salva em um vetor de estrutura personalizada? [fechadas]
Minha pergunta é realmente sobrepergunta já feita. Eu tentei oresposta dada por @ r3mus n0x Também vi algumas perguntas de SO que não me ajudaram a ter uma idéia clara da situação acima.
No post em questão, falta o MCVE, portanto, tentei um pouco e criei o código a seguir e com o mesmo erro que o @ user10213044 mencionou em seu post.
error C2065: 'm_func': undeclared identifier
Minha pergunta:
Q1: Podemos realmente armazenar o ponteiro para algumas das funções de membro de uma classe (como no exemplo a seguir) em um membro privado (por exemplo, vetor array)? Em caso afirmativo, qual é o motivo da mensagem de erro acima?
Q2: Eu também tentei escrever dentro do loop for:
classFuncPtr fun = bindClassPtr->m_func; // compiles
fun(str); // error
deu-me:Mensagem de erro
error: must use '.*' or '->*' to call pointer-to-member function in 'fun (...)', e.g. '(... ->* fun) (...)'
fun(str); // error
que eu não conseguia entender. Alguém pode me dizer o que deu errado neste caso?
A segunda tentativa foi semelhante ao caso a seguir, que usamos para funções normais caso ponteiro.
typedef void(*FuncPtr)(const std::string&);
FuncPtr Lambda = [](const std::string& str) { std::cout << str << std::endl; };
Lambda(std::string("Hellow World"));
Aqui está o código que tentei:
#include <iostream>
#include <vector>
#include <string>
#include <memory>
cla,ss 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
*/
}
}
};