2011-11-21 50 views
1

我創建一個簡單的構造並初始化一個數組:C++初始化陣列中的構造EXC_BAD_ACCESS

// Construtor 
Cinema::Cinema(){ 
    // Initalize reservations 
    for(int i = 0; i < 18; i++){ 
     for(int j = 0; j < 12; j++){ 
      setReservation(i, j, 0); 
     } 
    } 

    // Set default name 
    setMovieName("N/A"); 

    // Set default price 
    setPrice(8); 
} 

的setReservation功能:

void Cinema::setReservation(int row, int column, int reservation){ 
    this->reservations[row][column] = reservation; 
} 

的setMovieName功能:

void Cinema::setMovieName(std::string movieName){ 
    this->movieName = movieName; 
} 

由於某些奇怪的原因,當我運行該程序時,setMovieName函數會提供以下呃ror:「節目接收信號:EXC_BAD_ACCESS」

如果我取出初始化保留陣列的for循環,則問題消失並且電影名稱設置沒有任何問題。任何想法我做錯了什麼?

這是Cinema.h文件:

#ifndef Cinema_h 
#define Cinema_h 

class Cinema{ 

private: 
    int reservations[17][11]; 
    std::string movieName; 
    float price; 
public: 
    // Construtor 
    Cinema(); 

    // getters/setters 
    int getReservation(int row, int column); 
    int getNumReservations(); 
    std::string getMovieName(); 
    float getPrice(); 

    void setReservation(int row, int column, int reservation); 
    void setMovieName(std::string movieName); 
    void setPrice(float price); 
}; 

#endif 
+2

預訂數組是如何聲明的?混合行和列並不罕見。 – UncleBens

+0

爲什麼你必須使用手動循環?任何有自尊心的容器都會有一個構造函數來清零其元素。 –

+0

感謝您的快速回復。剛剛添加了上面的.h文件@UncleBens – bdev

回答

2

如果有應該是18行12列,這就是你到底如何需要DIMENSION的數組:不是「幻數」對於那些

int reservations[18][12]; 

而且更好地利用靜態常量。另外,行和列很容易混淆,所以更好的想法是給出更多的描述性名稱來迭代變量ij

class Cinema 
{ 
    static const int row_count = 18; 
    static const int column_count = 12; 

    int reservations[row_count][column_count]; 

    //looping 
    Cinema() { 
     for (int row = 0; row < row_count; ++row) { 
     for (int column = 0; column < column_count; ++column { 
      ... 
     } 
     } 
    } 

}; 
+1

哇,我是一個完全白癡。 – bdev

1

你初始化this->reservations地方還是靜態的?另外,尺寸是否正確?看到它的定義很重要。否則,這可能是原因。如果這不能解決您的問題,請設置一箇中斷點,然後逐步執行代碼,以查看失敗的代碼行。

1

你實際上是否在分配預留空間?

如果它的尺寸是固定的,你是不是宣佈它爲int[18][12]?如果不是,請不要使用int**。這是C++,你可以使用

std::vector<std::vector<int>> 

編輯:有是你的問題:

int reservations[17][11]; 

這17/11的尺寸,你迭代18/12。 使用int[18][12]

+0

感謝您的回覆。 for循環迭代只要我<18和j <12所以它應該很好 – bdev

1

您的reservations數組太小。您應該使用行數/列數(即18和12)進行初始化,而不是最高索引。當您初始化保留時,它將在陣列末尾運行並損壞movieName,之後當您嘗試訪問它時會發生任何事情。

此外,您可能已經知道這一點,但您不需要總是在C++中使用this->作爲成員變量訪問的前綴。這是暗示,除非你有一個具有相同名稱的本地變量(如你的setMovieName函數)。

1

您聲明瞭一個數組int reservations[17][11];,但您的構造函數正在訪問[0 to 17][0 to 11],這超出了有效範圍[0 to 16][0 to 10]

您應該更喜歡該陣列上的std::vector<std::vector<int>>