**已关闭。**此问题需要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;
}
1条答案
按热度按时间g6baxovj1#
你写的是一个数组的定义,而不是一个数组成员的赋值。就像错误所说的,你不能声明和定义具有不同边界的同一个数组。
C++不支持指定的数组初始化器,所以你最好用
std::array<calcul, 128>
代替原始数组,并写一个helper函数或lambda来初始化静态成员:Demo
在这里,我使用了一个立即调用的lambda函数,而不是一个单独的helper函数,但后者也可以工作。