2015-01-21 5 views
1

Это мой dice.hIm не в состоянии получить доступ к функции (которая находится в классе) от основной, используя массив указателей

class Dice 
{ 
public: 
int value; 
int nrOfFaces; 
Dice(); 
void toss(); 
}; 

это мой dice.cpp

//this is the default constructor (has no parameter) 

Dice::Dice() 
{ 
nrOfFaces = 6; 
value = rand() % nrOfFaces + 1; 
} 

//this function gives the dice a new random value 

void Dice::toss() 
{ 
value = rand() % nrOfFaces + 1; 

} 

Чтобы немного объяснить, что я пытаюсь сделать здесь. Я отправлю код, который находится в основном внизу этого сообщения. В главном коде Im застрял в той части, где, как вы можете видеть, я объявляю массив указателей. Теперь я пытаюсь сначала бросить 5 кубиков в одну петлю. и в другой фикере I, пытающейся распечатать значение 5 кубиков. Но то, как я делаю это, похоже, не работает. Я не получаю ошибку, но программа ломается, когда она добирается до pYatzy [i] -> toss();

Вот мой main.cpp

int main() 
{ 
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 

//type cast is done in the c++ way 
srand(static_cast<unsigned>(time(NULL))); 

Dice *dice1 = new Dice; 

cout << dice1->value << endl << endl; 

dice1->toss(); 

cout << dice1->value << endl << endl; 


for (int i = 0; i < 5; i++) 
{ 

    dice1->toss(); 
    cout << dice1->value; 
    cout << " "; 

} 

Dice *pYatzy[5]; 

for (int i = 0; i < 5; i++) 
{ 

    pYatzy[i]->toss(); 

} 

for (int i = 0; i < 5; i++) 
{ 

} 

system("pause>nul"); 
return 0; 
} 

Спасибо!

ответ

2

Здесь вы делаете 5 неинициализированные указатели:

Dice *pYatzy[5]; 

и здесь вы разыменование неинициализированных указателей, что приводит к неопределенному поведению:

for (int i = 0; i < 5; i++) 
{ 
    pYatzy[i]->toss(); 

простое решение было бы заменить этот код:

Dice pYatzy[5]; 
for (int i = 0; i < 5; i++) 
{ 
    pYatzy[i].toss(); 

Кроме того, ранее в вашем коде вы можете написать Dice dice1; dice1.toss(); и т. Д., Вместо использования new. Нет необходимости использовать new 99% времени в C++.

+0

Я просто использую «новые», потому что инструкции учителя просили нас. Код, который вы только что написали, - это все еще массив указателей? Я вроде как использовал это для начала, потому что знаю, что массив уже является указателем. Это оно? –

+0

@TarikNeaj нет, это массив объектов. Если вам действительно нужен массив указателей, вам придется перебирать и называть 'new' 5 раз. –

+0

Да, мне нужно сначала объявить массив из 5 указателей в Dice. Затем я должен бросить эти 5 кубиков, а затем распечатать их значения. Не могли бы вы показать мне, как это сделать? Я всю ночь учился и разбирал вещи. –