2013-02-09 100 views
2

我希望在一个类中定义一个数组,并将该类的变量设置为该数组的元素。下面的实施会导致分段错误:如何在C++中定义一个常量数组?

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

我该如何解决?

回答

3

最快的办法是改变char MAP[];char MAP[3];

有代码其他有趣的事情。

1)它不会按给定的方式编译(你永远不会定义一个百分比)。
2)如果有人发送一个“int a”到你的地图范围之外的set函数会发生什么? (IE:56而不是0,1或2)?

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

顺便说来代替,这是一个好主意为宏保留ALL UPPERCASE标识符。这样可以最大限度地减少意外文本替换的可能性。而且,它在眼睛上更容易。

+0

+1不错。我喜欢''ABCDEF'[1级]'的技巧。 – 2013-02-09 05:07:09

1

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

因此,声明一个数组如下char MAP[];将始终导致编译错误。

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

但是,如果你的要求是具有动态分配,你可以声明为

char *MAP; 

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

MAP =新的char [N ]。

其中n表示数组内需要的元素的数量。

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

delete[] MAP; 

破坏过程中,完成释放内存。