How to call through a member function pointer?
More parentheses are required:
(bigCat.*pcat)();
^ ^
The function call (()
) has higher precedence than the pointer-to-member binding operator (.*
). The unary operators have higher precedence than the binary operators.
C++: Calling member function via pointer
You need to tell the compiler which class the foo
s are coming from (otherwise it thinks they're functions from global scope):
void A::setPtr(int v){
if(v == 1){
_currentPtr = &A::foo1;
// ^^^^
} else {
_currentPtr = &A::foo2;
// ^^^^
}
}
and you need a set of parentheses here:
std::cout << (this->*_currentPtr)(4,5);
// ^ ^
Use pointer to member function to determine which function to call
Syntax to call a member function via member function pointer is
(this->*memf)();
You cannot magically turn the string into a member function pointer. Sloppy speaking, names of functions do not exist at runtime. If you want such mapping you need to provide it yourself. No way around that. What you can avoid is the "forest of if-else" by using a std::unordered_map
:
#include <unordered_map>
#include <string>
#include <iostream>
class Karen
{
public:
void complain(std::string level) {
static const std::unordered_map<std::string, void(Karen::*)() const> m{
{"debug",&Karen::debug},
{"info",&Karen::info},
{"warning",&Karen::warning},
{"error",&Karen::error}
};
auto it = m.find(level);
if (it == m.end()) return;
(this->*(it->second))();
}
private:
void debug(void) const { std::cout << "debug\n"; }
void info(void) const { std::cout << "info\n"; }
void warning(void) const { std::cout << "warning\n"; }
void error(void) const { std::cout << "error\n"; }
};
int main() {
Karen k;
k.complain("info");
}
Live Demo
As mentioned in comments, you could use an enum in place of the string. When possible you should use the help of the compiler, which can diagnose a typo in an enum but not in a string. Alternatively you could directly pass a member function pointer to complain
. Then implementation of complain
would be trivial, no branching needed. Though this would require the methods to be public and the caller would have to deal with member function pointers.
If you are not allowed to use C++11 or newer you should have a serious talk with your teacher. Soon C++20 will be the de facto standard and things have changed quite a lot. I am not fluent in C++98 anymore, so here is just a quick fix of the above to get it working somehow. You cannot use std::unordered_map
but there is std::map
and initialization of the map is rather cumbersome:
#include <map>
#include <string>
#include <iostream>
class Karen
{
typedef void(Karen::*memf_t)() const;
typedef std::map<std::string,void(Karen::*)() const> map_t;
public:
void complain(std::string level) {
map_t::const_iterator it = get_map().find(level);
if (it == get_map().end()) return;
(this->*(it->second))();
}
private:
const map_t& get_map(){
static const map_t m = construct_map();
return m;
}
const map_t construct_map() {
map_t m;
m["debug"] = &Karen::debug;
m["info"] = &Karen::info;
m["warning"] = &Karen::warning;
m["error"] = &Karen::error;
return m;
}
void debug(void) const { std::cout << "debug\n"; }
void info(void) const { std::cout << "info\n"; }
void warning(void) const { std::cout << "warning\n"; }
void error(void) const { std::cout << "error\n"; }
};
int main() {
Karen k;
k.complain("info");
}
Live Demo
Calling a function pointer on a member function
myMethod
is a member function, so you need to call it on an instance of the class it is a member of. Since you are already in a member function, you can use this
:
(this->*myMethod)()
C++ Calling Member Function by Function Pointer Error
I think the syntax to invoke that member function by pointer should be e.g.
( this->*FunctionPointer )( Parameters, ReturnValue );
C++ has two operators, .*
and ->*
, specifically created to access class members by pointer. Here's an article on the topic. The ubiquitous *
operator just doesn't work with class member pointers.
Calling C++ member functions via a function pointer
Read this for detail :
// 1 define a function pointer and initialize to NULL
int (TMyClass::*pt2ConstMember)(float, char, char) const = NULL;
// C++
class TMyClass
{
public:
int DoIt(float a, char b, char c){ cout << "TMyClass::DoIt"<< endl; return a+b+c;};
int DoMore(float a, char b, char c) const
{ cout << "TMyClass::DoMore" << endl; return a-b+c; };
/* more of TMyClass */
};
pt2ConstMember = &TMyClass::DoIt; // note: <pt2Member> may also legally point to &DoMore
// Calling Function using Function Pointer
(*this.*pt2ConstMember)(12, 'a', 'b');
How to call private member function by using a pointer
Add a public method to your class that returns a pointer to the private function:
class A
{
private:
void error(void);
public:
void callError(void);
auto get_error_ptr() {
return &A::error;
}
};
int main(void)
{
void (A::*abc)(void) = &A::callError;
A test;
(test.*abc)();
void (A::*error_ptr)(void) = test.get_error_ptr();
(test.*error_ptr)();
return (0);
}
But I wouldn't suggest actually using this kind of code in a real application, it is extremely confusing and error-prone.
How do I call pointer-to-member functions from another class?
You need an instance to call it:
void Game::tick(){
(this->*(button1->click))();
}
Demo
C++ Call Pointer To Member Function
Pointers to non-static member functions are a unique beast with unique calling syntax.
Calling those functions require you to supply not just named parameters, but also a this
pointer, so you must have the Box
pointer handy that will be used as this
.
(box->*h)(xPos, yPos, width, height);
Related Topics
Dangling References and Undefined Behavior
Opencv Gtk+2.X Error - "Unspecified Error (The Function Is Not Implemented...)"
What Is the Meaning of 'Struct X Typedef' VS. 'Typedef Struct X'
Priority Queue with Limited Space: Looking for a Good Algorithm
Wrap Overloaded Function via Std::Function
How to Implement Readlink to Find the Path
Extract C++ Template Parameters
Trying to Pass String Literals as Template Arguments
Why Is the New Operator Allowed to Return *Void to Every Pointer-Type
C++. Error: Void Is Not a Pointer-To-Object Type
How to Open a Folder in %Appdata% with C++
C++: Std::Move with Rvalue Reference Is Not Moving Contents
Linking Not Working in Homebrew's Cmake Since Mojave
Parse String Containing Numbers into Integer Array
Simulating Mouse Clicks on MAC Os X Does Not Work for Some Applications
How to Apply Content Not Explicitly Cited from the Normative References to the C++ Standard