如何初始化函数方法指针的静态数组 c++

问题描述 投票:0回答:1

我有一个类包含与数学运算相对应的公共静态方法。该类是这样实现的

class test
{
    public:
        test(){};
        ~test(){};
        typedef int(test::*calcul)(int a,int b);
        /*STATIC METHOD*/
        static int add(int a, int b);
        static int divide(int a, int b);
        static int multiply(int a, int b);
        static int substract(int a, int b);
        static calcul _calcul[128];
    private:
        /* data */
};

我还添加了一个指向函数的指针数组,这样我就可以将这些函数存储到该数组中并供以后使用。但是,当我尝试在实现文件中初始化静态数组时出现错误。这是我得到的错误:

test.cpp:34:14: error: conflicting declaration ‘int (test::* test::_calcul [43])(int, int)’
   34 | test::calcul test::_calcul['+'] = test::add;
      |              ^~~~
test.cpp:15:23: note: previous declaration as ‘int (test::* test::_calcul [128])(int, int)’
   15 |         static calcul _calcul[128];

要在这里初始化数组的索引之一,我写的是:

test::calcul test::_calcul['+'] = test::add;

我对上述代码示例的假设是,索引“+”处的 _calcul 数组将使用添加静态方法的函数指针进行初始化,但实际情况并非如此。

这里是完整的程序:

#include <cstdlib>
#include <iostream>

class test
{
    public:
        test(){};
        ~test(){};
        typedef int(*calcul)(int a,int b);
        /*STATIC METHOD*/
        static int add(int a, int b);
        static int divide(int a, int b);
        static int multiply(int a, int b);
        static int substract(int a, int b);
        static calcul _calcul[128];
    private:
        /* data */
};

/*----------------------------------STATIC MEMBER FUNCTION----------------------------------*/
int test::add(int a, int b){return a + b;};
int test::substract(int a, int b){return a - b;};
int test::multiply(int a, int b){return a * b;};
int test::divide(int a, int b)
{
    if (b == 0)
    {
        std::cerr << "Error\n";
        exit(1);
    }
    return a / b;
};
/*----------------------------------STATIC MEMBER FUNCTION----------------------------------*/
test::calcul test::_calcul['+'] = test::add;

int main(void)
{
    test d;
}
c++ static-methods static-members
1个回答
0
投票

你写的是数组的定义,不是对数组成员的赋值。就像错误所说的那样,您不能声明和定义具有不同边界的相同数组。

C++ 不支持数组的指定初始值设定项,因此最好的办法是使用

std::array<calcul, 128>
而不是原始数组,并编写可用于初始化静态成员的辅助函数或 lambda:

class test
{
public:
    using calcul = int(*)(int, int);
    //...
    static int add(int a, int b);
    static inline const std::array<calcul, 128> _calcul = []() {
        std::array<test::calcul, 128> ret;
        ret['+'] = &calcul::add;
        //...
        return ret;
    }();
    //...
};

演示

这里我使用了立即调用的 lambda 而不是单独的辅助函数,但后者也可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.