2016-03-01 155 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