指向 class 方法错误 c++11 的指针数组
array of pointers to class method error c++11
我得到了一个小 "problem",其中包含指向 class 方法的指针数组。
简而言之:
我的 class Complex 有四个功能 - double funX(void)
:
double fun1(void) const {...}
double fun2(void) const {...}
...
然后我有指向上述方法的成员函数的指针数组。
double (Complex::*arr_ptr_fun[4])(void) const;
我在构造函数初始化列表中初始化这个数组:
... : re(_re), im(_im), arr_ptr_fun{&fun1,&fun2,&fun3,&fun4} { /*EMPTY*/ }
当我尝试通过这个数组调用这 4 个函数中的任何一个时,例如:
std::cout << this->*arr_ptr_fun[0]();
我收到一个我不明白的错误:
error: must use '.*' or '->*' to call pointer-to-member function in '((const Complex*)this)->Complex::arr_ptr_fun[0] (...)', e.g. '(... ->* ((const Complex*)this)->Complex::arr_ptr_fun[0]) (...)'
double fun4(void) const {std::cout << this->*arr_ptr_fun[0](); return sqrt(fun3());}
通过哪个指针使用.*
或->*
...? (chaos *
宇宙指针?)
有什么想法吗?
需要把成员函数指针用括号括起来,
std::cout << (this->*arr_ptr_fun[0])();
@Aldehir 给出的答案是您具体问题的正确答案。但是,如果您使用的是 C++11(或更高版本),那么使用 std::mem_fn
to wrap calls to member functions. Using std::mem_fn
you can eliminate the issues associated with .*
and ->*
. Here is an example:
可能会方便得多
#include <iostream>
#include <functional>
#include <array>
class Complex
{
public:
double fun1() const {return 1;}
double fun2() const {return 2;}
double fun3() const {return 3;}
double fun4() const {return 4;}
using MemFun = decltype(std::mem_fn(&Complex::fun1)) ;
static const std::array<MemFun, 4> arr_ptr_fun ;
} ;
const std::array<Complex::MemFun, 4> Complex::arr_ptr_fun {{
std::mem_fn(&Complex::fun1),
std::mem_fn(&Complex::fun2),
std::mem_fn(&Complex::fun3),
std::mem_fn(&Complex::fun4)
}} ;
int main()
{
//
// Call all the member functions using object my_foo.
//
Complex my_foo ;
for(auto func: Complex::arr_ptr_fun)
{
std::cout << func(my_foo) << std::endl;
}
//
// The same as above but using array indexing.
//
for(size_t i=0; i<Complex::arr_ptr_fun.size(); ++i)
{
std::cout << Complex::arr_ptr_fun[i](my_foo) << std::endl ;
}
return 0;
}
我得到了一个小 "problem",其中包含指向 class 方法的指针数组。
简而言之:
我的 class Complex 有四个功能 - double funX(void)
:
double fun1(void) const {...}
double fun2(void) const {...}
...
然后我有指向上述方法的成员函数的指针数组。
double (Complex::*arr_ptr_fun[4])(void) const;
我在构造函数初始化列表中初始化这个数组:
... : re(_re), im(_im), arr_ptr_fun{&fun1,&fun2,&fun3,&fun4} { /*EMPTY*/ }
当我尝试通过这个数组调用这 4 个函数中的任何一个时,例如:
std::cout << this->*arr_ptr_fun[0]();
我收到一个我不明白的错误:
error: must use '.*' or '->*' to call pointer-to-member function in '((const Complex*)this)->Complex::arr_ptr_fun[0] (...)', e.g. '(... ->* ((const Complex*)this)->Complex::arr_ptr_fun[0]) (...)'
double fun4(void) const {std::cout << this->*arr_ptr_fun[0](); return sqrt(fun3());}
通过哪个指针使用.*
或->*
...? (chaos *
宇宙指针?)
有什么想法吗?
需要把成员函数指针用括号括起来,
std::cout << (this->*arr_ptr_fun[0])();
@Aldehir 给出的答案是您具体问题的正确答案。但是,如果您使用的是 C++11(或更高版本),那么使用 std::mem_fn
to wrap calls to member functions. Using std::mem_fn
you can eliminate the issues associated with .*
and ->*
. Here is an example:
#include <iostream>
#include <functional>
#include <array>
class Complex
{
public:
double fun1() const {return 1;}
double fun2() const {return 2;}
double fun3() const {return 3;}
double fun4() const {return 4;}
using MemFun = decltype(std::mem_fn(&Complex::fun1)) ;
static const std::array<MemFun, 4> arr_ptr_fun ;
} ;
const std::array<Complex::MemFun, 4> Complex::arr_ptr_fun {{
std::mem_fn(&Complex::fun1),
std::mem_fn(&Complex::fun2),
std::mem_fn(&Complex::fun3),
std::mem_fn(&Complex::fun4)
}} ;
int main()
{
//
// Call all the member functions using object my_foo.
//
Complex my_foo ;
for(auto func: Complex::arr_ptr_fun)
{
std::cout << func(my_foo) << std::endl;
}
//
// The same as above but using array indexing.
//
for(size_t i=0; i<Complex::arr_ptr_fun.size(); ++i)
{
std::cout << Complex::arr_ptr_fun[i](my_foo) << std::endl ;
}
return 0;
}