Создание производного класса в C ++

0

Поэтому я пытаюсь создать класс 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

Я считаю, что эти ошибки связаны с тем, что я не правильно вывел классы. Может ли кто-нибудь объяснить мне, как это делается?

  • 2
    Вот почему вы разбиваете объявления на заголовочные файлы, а определения на файлы cpp. Вы никогда не должны включать файл cpp в другой файл cpp.
  • 2
    #include "Die.cpp" неверно. Отделите объявление вашего класса от заголовочного файла и используйте надлежащий include guard.
Показать ещё 4 комментария
Теги:
derived-class

2 ответа

1
Лучший ответ

Это обычно плохая форма для # включения файлов CPP. Но если вы хотите это сделать, избавьтесь от инструкции #include "Die.cpp" в main.cpp. Он уже включен в LoadedDie.cpp, поэтому вы включаете его дважды и дважды определяете его - следовательно, ошибка "переопределения".

  • 0
    Я должен сделать include cpp только из-за того, как мой проф отмечает оценки. Я исправил include die.cpp в основном, но я все еще получаю ошибки выше.
  • 0
    Вы не можете инициализировать члена базового класса - вы не можете установить сторону. Вместо этого вызовите конструктор базового класса: Die (6) - в списке инициализатора. Вместо LoadedDie :: LoadedDie (): side (6) {} LoadedDie :: LoadedDie (): Die (6) {}
Показать ещё 3 комментария
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

'=' - это присвоение, в то время как вы равны '=='. Вы не можете назначить 1 (rand()% 2) +1).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню