Поэтому я пытаюсь создать класс Die и класс LoadedDie, где находится класс Die и базовый класс LoadedDie. Единственное отличие между двумя классами состоит в том, что функция roll в LoadedDie имеет 25% -ный шанс получить наибольшее число, тогда как у Die есть шанс 1/6. Это мой первый раз, когда мы работаем с производным классом, и у меня, похоже, есть проблема, пытающаяся выполнить эту задачу. Может кто-нибудь объяснить мне, как это работает, и показать мне, как я буду делать это с моими классами (как визуальный ученик и примеры необходимости). Я знаю, что мой базовый класс (Die) работает, когда я тестировал его, прежде чем переходить на мой LoadedDie.
Die.cpp
#include<iostream>
#include <cstdlib>
using namespace std;
class Die{
public:
Die();
Die(int numSide);
virtual int roll() const;
int rollTwoDice(Die d1, Die d2);
int side;
};
Die::Die():side(6){}
Die::Die(int numSide):side(numSide){}
int Die::roll() const{
return rand() % side + 1;
}
int Die::rollTwoDice(Die d1, Die d2){
return d1.roll()+d2.roll();
}
LoadedDie.cpp
#include<iostream>
#include <cstdlib>
#include "Die.cpp"
using namespace std;
class LoadedDie: public Die{
public:
LoadedDie();
LoadedDie(int numSide);
virtual int loadedroll() const;
};
LoadedDie::LoadedDie():side(6){}
LoadedDie::LoadedDie(int numSide):side(numSide){}
int LoadedDie::loadedroll() const{
if ((rand() % 2)+1) = 1){
return side;
}
return (rand() % (side-1)) + 1;
}
int LoadedDie::rollTwoDice(LoadedDie d1, LoadedDie d2){
return d1.roll()+d2.roll();
}
My DieTester.cpp (просто основной класс для проверки работы вышеперечисленных классов):
#include "LoadedDie.cpp"
#include<iostream>
#include<time.h>
#include <stdlib.h>
using namespace std;
int main(){
srand(time(NULL));
Die d(6);
LoadedDie dl(6);
cout << d.roll()<<endl;
cout<<"ld " << dl.roll()<<endl;
}
С приведенными выше классами я получаю эту ошибку, когда запускаю мой DieTester.cpp (если это помогает):
In file included from DieTester.cpp:1:
LoadedDie.cpp: In constructor ‘LoadedDie::LoadedDie():
LoadedDie.cpp:13: error: class ‘LoadedDie does not have any field named ‘side
LoadedDie.cpp: In constructor ‘LoadedDie::LoadedDie(int):
LoadedDie.cpp:15: error: class ‘LoadedDie does not have any field named ‘side
LoadedDie.cpp: In member function ‘virtual int LoadedDie::loadedroll() const:
LoadedDie.cpp:18: error: expected primary-expression before ‘= token
LoadedDie.cpp:18: error: expected ‘; before ‘) token
Я считаю, что эти ошибки связаны с тем, что я не правильно вывел классы. Может ли кто-нибудь объяснить мне, как это делается?
Это обычно плохая форма для # включения файлов CPP. Но если вы хотите это сделать, избавьтесь от инструкции #include "Die.cpp" в main.cpp. Он уже включен в LoadedDie.cpp, поэтому вы включаете его дважды и дважды определяете его - следовательно, ошибка "переопределения".
В то время как комментирует разделение кода на файлы заголовков и кодов, все они действительны (делайте это СЕЙЧАС), они не имеют ничего общего с остальными ошибками и вашими вопросами. Давайте рассмотрим их один за другим:
LoadedDie.cpp: In constructor ‘LoadedDie::LoadedDie():
LoadedDie.cpp:13: error: class ‘LoadedDie does not have any field named ‘side
LoadedDie действительно не имеет такого члена. Он является членом Die. Вы не инициализируете членов своего базового класса в производном классе. Вместо этого вы должны вызвать конструктор базового класса следующим образом:
LoadedDie::LoadedDie() : Die() { }
LoadedDie.cpp: In constructor ‘LoadedDie::LoadedDie(int):
LoadedDie.cpp:15: error: class ‘LoadedDie does not have any field named ‘side
Такая же проблема снова. То же решение:
LoadedDie::LoadedDie(int numSide) : Die(numSide) { }
Обратите внимание, что вы можете использовать значения по умолчанию для аргументов и просто написать один конструктор вместо двух:
class Die {
public:
Die(int numSide = 6);
....
}
if ((rand() % 2)+1) = 1){
LoadedDie.cpp: In member function ‘virtual int LoadedDie::loadedroll() const:
LoadedDie.cpp:18: error: expected primary-expression before ‘= token
LoadedDie.cpp:18: error: expected ‘; before ‘) token
'=' - это присвоение, в то время как вы равны '=='. Вы не можете назначить 1 (rand()% 2) +1).
#include "Die.cpp"
неверно. Отделите объявление вашего класса от заголовочного файла и используйте надлежащий include guard.