C ++ Инициализировать массив в конструкторе EXC_BAD_ACCESS - PullRequest
1 голос
/ 21 ноября 2011

Я создаю простой конструктор и инициализирую массив:

// 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 выдает следующую ошибку: «Полученный сигнал программы: 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

Ответы [ 5 ]

2 голосов
/ 21 ноября 2011

Если предполагается, что будет 18 строк и 12 столбцов, это именно то, что вам нужно для измерения вашего массива:

int reservations[18][12];

Также лучше использовать для них статические константы, а не "магические числа". Кроме того, строки и столбцы легко перепутать, поэтому лучшей идеей будет дать более описательные имена для итерационных переменных i и j.

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 голос
/ 21 ноября 2011

Вы объявили массив int reservations[17][11];, но ваш конструктор обращается к [0 to 17][0 to 11], что выходит за допустимые диапазоны [0 to 16][0 to 10].

Вы должны предпочесть std::vector<std::vector<int>> этому массиву.

1 голос
/ 21 ноября 2011

Ваш массив reservations слишком мал.Вы должны инициализировать его числом строк / столбцов (т.е. 18 и 12), а не самым высоким индексом.Когда вы инициализируете резервирование, оно будет запускаться с конца массива и повреждаться movieName, после чего может произойти что-либо, когда вы попытаетесь получить к нему доступ.

Кроме того, вы можете знать это уже, но выВсегда нужно добавлять префикс доступа к переменной-члену this-> в C ++.Это подразумевается, если у вас нет локальной переменной с тем же именем (как в вашей функции setMovieName).

1 голос
/ 21 ноября 2011

Вы действительно выделяете место для бронирования?

Если это фиксированный размер, вы объявляете его как int[18][12]?

Если нет, пожалуйста, не используйте int**. Это C ++, вы можете использовать

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

РЕДАКТИРОВАТЬ: Есть ваша проблема:

int reservations[17][11];

Это 17/11 измерений, вы перебираете 18/12. Используйте int[18][12].

1 голос
/ 21 ноября 2011

Вы инициализировали this->reservations где-нибудь или это статично? Кроме того, правильны ли размеры? Было бы важно увидеть его определение. В противном случае это может быть причиной. Если это не решит вашу проблему, установите точку останова, а затем пошагово пройдитесь по коду, чтобы увидеть строку, где он терпит неудачу.

...