我希望在类中定义一个数组,并将该类的变量设置为数组的元素。下面的实现会导致分段错误:
class Grade {
char MAP[];
char *letter;
public:
Grade();
~Grade();
void set(int);
};
Grade::Grade(){
letter = new char;
*letter = '\0';
MAP[0] = 'A';
MAP[1] = 'B';
MAP[2] = 'C'; // result in segmentation fault
MAP = { 'A', 'B', 'C'}; // result in segmentation fault
}
Grade::~Grade(){
delete letter;
delete percent;
}
void Grade::set(int a){
*letter = MAP[a];
}
我该如何解决?
答案 0 :(得分:3)
最快捷的方法是将char MAP[];
更改为char MAP[3];
代码中还有其他有趣的东西。
1)它没有按照给定的编译(你永远不会定义百分比是多少) 2)如果有人向您的地图范围之外的集合函数发送“int a”会发生什么? (IE:56而不是0,1或2)?
答案 1 :(得分:2)
对你想要代码做什么做一些假设,似乎最简单的解决方法是替换当前的
char MAP[];
char *letter;
...
void Grade::set(int a){
*letter = MAP[a];
}
与
char letter_;
...
void Grade::set( int const grade )
{
// Assuming grade in range 1 through 5 inclusive.
letter_ = "ABCDEF"[grade - 1];
}
顺便说一下,为宏保留所有UPPERCASE标识符是个好主意。这样,您可以最大限度地减少意外文本替换的可能性。此外,它更容易在眼睛上。
答案 2 :(得分:1)
对于Arrays,编译器要求您显式声明数组中的元素数。这是为了确保在执行之前确定数组的大小。
因此,如下所述声明数组char MAP[];
将始终导致编译错误。
您的问题的可能解决方案是[如David D所述]将其声明为char MAP[3]
;
但是,如果您的要求是动态分配,您可以将其声明为
char *MAP;
并在构造函数内部分配所需的内存,如下所示:
MAP = new char [n];
其中n表示数组中所需的元素数。
注意:如果您动态声明数组,则需要使用
delete[] MAP;
在破坏期间完成释放内存。