2

我希望在一个类中定义一个数组,并将类的变量设置为数组的元素。下面的实现会导致分段错误:

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

我应该如何解决它?

4

3 回答 3

3

最快的方法是更改char MAP[];​​为char MAP[3];

代码中还有其他有趣的东西。

1)它没有按照给定的方式编译(你永远不会定义百分比是什么)。
2) 如果有人向您的 set 函数发送了超出地图范围的“int a”,会发生什么情况?(即:56 而不是 0、1 或 2)?

于 2013-02-09T03:31:51.530 回答
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];
}

顺便说一句,为宏保留所有大写标识符是个好主意。这样可以最大限度地减少意外文本替换的可能性。此外,它对眼睛更容易。

于 2013-02-09T03:35:29.130 回答
1

在数组的情况下,编译器要求您显式声明数组中的元素数量。这是为了确保在执行之前确定数组的大小。

因此,如下声明数组char MAP[];总是会导致编译错误。

您的问题的一个可能的解决方案是 [如 David D 所述] 将其声明为char MAP[3];

但是,如果您的要求是动态分配,您可以将其声明为

char *MAP;

并在构造函数内部分配所需的内存,如下所示:

MAP = 新字符 [n];

其中 n 表示您需要在数组中的元素数。

注意:如果动态声明数组,则需要使用

  delete[] MAP;

在销毁期间完成释放内存。

于 2013-02-09T04:00:46.153 回答