2016-03-01 153 views
0

我有兩個類,一個叫Handler,另一個叫Dice。在我的Handler類中,我有一個名爲Dice **dices的私有變量和一個名爲rollDices的公共函數。在我的Dice類中,我有一個叫做折騰的函數,它會隨機化一個數字1-6。問題是,當功能rollDices正在調用功能折騰時,我得到EXT_BAD_ACCESStoss函數。有誰知道爲什麼,並有解決方案嗎?指向指針的指針在調用函數時獲得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

與你的問題沒有關係,但「骰子」實際上是「死」的複數; 「骰子」不正確。 –

+0

哈哈對不起,英文不太好! – pottsork

+0

「骰子」是「骰子」的複數這一事實,即使是母語爲英語的人也很容易錯過。另一個有趣的事實:「歌劇」是「作品」的複數。 –

回答

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

分配頂層指針,現在我們擁有內存中的所有行。當您添加列時

dices[nrOfDices]= new Dice(nrOfDices); 

這不會爲所有行添加新的Dice。它在dices有效範圍的末尾添加一個新的Dice。你需要做的是使用一個循環,並經過所有行並添加Dice到每一個像

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

我明白你說什麼,一切似乎合乎邏輯,但是,我得到了和以前一樣的問題。我添加了dices [i] = new Dice(nrOfDices);到我的循環,但現在我得到錯誤:EXC_ARITHMETIC – pottsork

+0

@pottsork什麼是'allDices',它是如何初始化? – NathanOliver

+0

是不是allDices只是一個指針指向數組,它指向類骰子,我分配內存的大小爲nrOfDices?因爲這是我使用allDices的代碼中的第一次。 – pottsork

0

你只分配在指數nrOfDices一個骰子對象(其中的方式爲界),如果你想分配你需要的所有骰子對象:

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