如何初始化静态数组指针函数方法c++ [已关闭]

wn9m85ua  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(138)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2天前关闭。
Improve this question
我有一个类,它保存了对应于数学运算的公共静态方法。这个类是这样实现的

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];

要初始化数组的indexx之一,这里我写:

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

我对上述代码示例的假设是,索引'+'处的_calcul数组将使用add static方法的函数指针进行初始化,但实际上并不是这样。
下面是完整的程序:

#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;
}
g6baxovj

g6baxovj1#

你写的是一个数组的定义,而不是一个数组成员的赋值。就像错误所说的,你不能声明和定义具有不同边界的同一个数组。
C++不支持指定的数组初始化器,所以你最好用std::array<calcul, 128>代替原始数组,并写一个helper函数或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;
    }();
    //...
};

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

相关问题