指向类方法错误c ++ 11的指针数组

Posted

技术标签:

【中文标题】指向类方法错误c ++ 11的指针数组【英文标题】:array of pointers to class method error c++11 【发布时间】:2015-11-25 20:44:57 【问题描述】:

我遇到了一个关于类方法指针数组的小“问题”。

简而言之: 我的 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());

通过哪个指针使用.*-&gt;*...? (chaos *宇宙指针?)

有什么想法吗?

【问题讨论】:

我没有尝试自己编译它,因为您没有发布足够的代码使其可编译,但错误看起来编译器很混乱,需要括号:std::cout &lt;&lt; (this-&gt;*arr_ptr_fun[0])(); 【参考方案1】:

需要将成员函数指针用括号括起来,

std::cout << (this->*arr_ptr_fun[0])();

【讨论】:

谢谢,求解器在课堂上的使用,但是其他范围呢?例如这:朋友 std::ostream& operator @Steve,我相信这是因为 arr_ptr_fun 不是静态成员变量。您需要在c 中引用该成员。试试这个:os &lt;&lt; (c.*(c.arr_ptr_fun[0]))();。话虽如此,如果arr_ptr_fun 对于Complex 的每个实例都相同,那么将其设为静态就没有问题。 哇,这行得通,但怎么会呢?两次使用变量名?如果我有对象数组,我将不得不写 (arr[0].*(arr[0].arr_ptr_fun[0]))() ? @Steve,arr_ptr_funComplex 的实例成员,因此您需要Complex 的实例,在本例中为c 来获取数组。如果您有一个复杂对象数组,那么是的,您必须这样做。或者,如果您在Complex 中将arr_ptr_fun 设为静态,那么您可以使用(arr[0].*(Complex::arr_ptr_fun[0]))()。当然,这假设arr_ptr_fun 将始终是[&amp;Complex::fun1, &amp;Complex::fun2, &amp;Complex::fun3, &amp;Complex::fun4] 谢谢百万次 :) 我必须明白这一点。我有一个包含 10 个复杂数组的类,我试图让 【参考方案2】:

@Aldehir 给出的答案是您特定问题的正确答案。但是,如果您使用的是 C++11(或更高版本),那么使用 std::mem_fn 包装对成员函数的调用可能会更方便。使用std::mem_fn,您可以消除与.*-&gt;* 相关的问题。这是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;

【讨论】:

以上是关于指向类方法错误c ++ 11的指针数组的主要内容,如果未能解决你的问题,请参考以下文章

C ++在指向结构的指针中访问类数组指针

C语言 指向二维数组的指针

C指针:指向一个固定大小的数组

用指向数组的指针时 出现错误,怎样解决。。。。

指向数组的指针的 C++ 模板类动态数组

如何得到指针指向的数组的长度