我有一个类包含与数学运算相对应的公共静态方法。该类是这样实现的
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++ 不支持数组的指定初始值设定项,因此最好的办法是使用
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 而不是单独的辅助函数,但后者也可以工作。