2016-03-01 3 views
0

У меня есть два класса, один из которых называется Handler, а один - Dice. В моем классе Handler у меня есть личная переменная с именем Dice **dices и публичная функция, называемая rollDices. И в моем классе Dice у меня есть функция под названием toss, которая будет рандомизировать число 1-6. Проблема заключается в том, что когда функция rollDices вызывает функцию toss, я получаю EXT_BAD_ACCESS в функции toss. Кто-нибудь знает, почему, и есть решение для этого?Указатель на указатель получает EXC_BAD_ACCESS при вызове функции

Мои Handler.cpp:

void Handler::rollDices(){ 
    Dice **allDices = new Dice*[this->nrOfDices]; 
    this->dices = allDices; 
    dices[nrOfDices]= new Dice(nrOfDices); 
    int count =1; 
    for (int i = 0; i < this->nrOfDices; i++) 
    { 
     allDices[i]->toss(); 
     cout << "Dice "<< count << ": " << allDices[i]->getValue() << endl; 
     count ++; 
    } 
} 

Мои Dice.cpp:

void Dice::toss(){ 
    this->value = rand()%this->nrOfSides+1; //Value is a private int in Dice class 
} 

Если вам нужно больше кода я могу разместить его, просто скажите мне!

+1

Не связано с вашей проблемой, но «кубик» на самом деле является множественным числом «die»; «кубики» неверны. –

+0

ха-ха извините, не так хорошо на английском! – pottsork

+0

Тот факт, что «кости» - это множественное число «кости», является одной из тех вещей, которые даже простые носители английского языка могут легко пропустить. Еще один забавный факт: «опера» - это множественное число «опус». –

ответ

0
Dice **allDices = new Dice*[nrOfDices]; 

Выделяет указатель верхнего уровня, поэтому теперь у нас есть все строки в памяти. При добавлении столбцов

dices[nrOfDices]= new Dice(nrOfDices); 

Это не добавляет новый Dice ко всем строкам. Он добавляет новый Dice в один конец до конца допустимого диапазона dices. Что вам нужно сделать, это использовать цикл и пройти через все строки и добавить Dice друг один, как

for (int i = 0; i < nrOfDices; i++) 
    dices[i] = new Dice(nrOfDices); 
+0

Я понимаю, что вы говорите, и все кажется логичным, однако я получаю ту же проблему, что и раньше. Я добавил кубики [i] = новые кости (nrOfDices); в мой цикл, но теперь я получаю ошибку: EXC_ARITHMETIC – pottsork

+0

@pottsork Что такое 'allDices' и как оно инициализируется? – NathanOliver

+0

Не всеDices просто указатель на указательный массив, который указывает на класс Dice, что я выделяю память с размером nrOfDices? Потому что это первый раз в моем коде, что я использую allDices. – pottsork

0

Вы выделяете только один объект Dice на индексе nrOfDices (который имеет границ, кстати), если вы хотите выделить все объекты Dice, которые вам нужны:

void Handler::rollDices(){ 
    Dice **allDices = new Dice*[nrOfDices]; 
    this->dices = allDices; 
    int count =1; 
    for (int i = 0; i < this->nrOfDices; i++) 
    { 
     dices[i] = new Dice(nrOfDices); 
     allDices[i]->toss(); 
     cout << "Dice "<< count << ": " << allDices[i]->getValue() << endl; 
     count ++; 
    } 
} 
+0

Как я сказал NathanOliver, я сделал это, но я получаю ошибку: EXC_ARITHEMTIC – pottsork

0

Как насчет использования современных C++? Попробуйте что-то вроде этого:

void Handler::rollDice() 
    { 
     std::vector<Dice> allDice(nrOfDice); 
     int count = 1; 
     for(const auto & d : allDice) 
     { 
      d.toss(); 
      cout << "Die "<< count << ": " << d.getValue() << endl; 
      ++count; 
     } 
    } 
+0

Хм, я еще не узнал о векторах, и я чувствую, что должен придерживаться стандарта, который я показываю выше, извините. – pottsork

+0

Итак, это домашняя работа? Причина того, что вы показываете выше, не является стандартной, она архаична и должна * никогда не использоваться в новом производственном коде. Если вы попытаетесь сделать этот код в моей команде, я заставлю вас переписать его. –

+0

Да, домашнее задание.Это странно, потому что это то, чему мы учимся в школе. Я скажу своему учителю, чтобы научить нас современному C++ вместо этого! Спасибо за указание на это! – pottsork