2013-02-09 63 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; 

破壞過程中,完成釋放內存。