所以我试着创建一个Die类和一个LoadedDie类,其中Die类是基类,而LoadedDie类是派生的。两个类之间的唯一区别是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();
}
我的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
我认为这些错误是由于我没有正确推导出这些类。有人可以向我解释这是怎么做到的吗?
答案 0 :(得分:2)
虽然赞扬将代码拆分为头文件和代码文件都是有效的(现在就做),但它们与剩余的错误和问题无关。让我们逐一介绍它们:
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
&#39; =&#39;在你平等的情况下进行分配&#39; ==&#39;。您不能将1分配给(rand()%2)+1)。
答案 1 :(得分:1)
#include CPP文件通常是不好的形式。但是如果你想这样做,那就去掉main.cpp中的#include“Die.cpp”语句。它已经包含在LoadedDie.cpp中,所以你要包含它两次并定义它两次 - 因此'重新定义'错误。