2014-11-19 4 views
0

Итак, я пытаюсь создать класс Die и класс LoadedDie, где находится класс Die и класс LoadedDie. Единственное отличие между двумя классами состоит в том, что функция roll в LoadedDie имеет 25% -ный шанс получить наибольшее число, тогда как у Die есть шанс 1/6. Это мой первый раз, когда мы работаем с производным классом, и у меня, похоже, есть проблема, пытающаяся выполнить эту задачу. Может кто-нибудь объяснить мне, как это работает, и показать мне, как я буду делать это с моими классами (как визуальный ученик и примеры необходимости). Я знаю, что мой базовый класс (Die) работает, когда я тестировал его, прежде чем переходить на мой LoadedDie.Создание производного класса в C++

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

Именно поэтому вы разбиваете ** декларации ** в заголовочные файлы и ** определения ** в файлы cpp. Вы никогда не должны включать файл cpp в другой файл cpp. – CoryKramer

+2

'#include" Die.cpp "неправильно. Отделите объявление класса к файлу заголовка и используйте соответствующий защитник. –

+0

Кроме того, используйте некоторые защитные устройства, например '#pragma once'. И конструктор 'LoadedDie' должен построить его' Die', а не 'side'. –

ответ

1

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

+0

Мне нужно сделать cpp include только из-за того, как мой prof отмечает У меня исправлено включение die.cpp в главном, но im все равно выдает ошибки выше. – ShadowViper

+0

Вы не можете инициализировать элемент базового класса - вы не можете установить сторону. Вместо этого вызовите конструктор базового слоя: Die (6) - в списке инициализаторов Вместо LoadedDie :: LoadedDie(): side (6) {} LoadedDie :: LoadedDie(): Die (6) {} –

+0

ok, но как бы я это сделал a LoadedDie, если я инициализировал его как Die (6)? – ShadowViper

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).

Смежные вопросы