用C ++创建派生类

时间:2014-11-19 17:57:46

标签: c++ derived-class

所以我试着创建一个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

我认为这些错误是由于我没有正确推导出这些类。有人可以向我解释这是怎么做到的吗?

2 个答案:

答案 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中,所以你要包含它两次并定义它两次 - 因此'重新定义'错误。