отладка - класс / объект, проблемы с нубами - PullRequest
0 голосов
/ 06 января 2012

Пожалуйста, разорвите этот код на части, сделайте его сложным и едва читаемым, я бы лучше однажды выучил трудный путь, чем многократно изучал одно и то же.

Базовый класс выглядит следующим образом:

class baseMob{
private:
    int _healthMax;
    int _healthCurrent;
    int _manaMax;
    int _manaCurrent;
    int _experiencePoints;
public:
    //Set max Hp
    void setHealthMax(int);
    //Get max Hp
    int getHealthMax();
    //Set Current Hp
    void setCurrentHealth(int);
    //Get Current Health
    int getCurrentHealth();
    //Set Max Mana
    void setMaxMana(int);
    //Get Max Mana
    int getMaxMana();
    //Set Current Mana
    void setCurrentMana(int);
    //Get Current Mana 
    int getCurrentMana();
    //getMob Exp on kill
    int getExperiencePoints();
    //Set mob Exp points
    void setExperiencePoints(int);
//leaving out the member functions for space conservation

};

Индивидуальный моб, которого я пытаюсь создать, - это зеленая слизь, которую я пытаюсь создать с помощью созданного по умолчанию конструктора ...

   class greenSlime: private baseMob{
    public:
        greenSlime(){
            setHealthMax(100);
            setMaxMana(100);
            setCurrentHealth(100);
            setCurrentMana(100);
            setExperiencePoints(150);
        }
    };

Моя основная функция выглядит следующим образом:

 greenSlime slime();
    for(; slime.getCurrentHealth() >= 0; slime.setCurrentHealth(-1)){
        cout << "The current health of the slime is: " << slime.getCurrentHealth() << endl;
        if (slime.getCurrentHealth() <= 0 ){
            cout << "Player is awarded with: " << slime.getExperiencePoints() << " Experience. ";
        }
    }

Если кто-то захочет разорвать это и заставить меня выглядеть как осел, я буду очень признателен за помощь.

Ошибка, которую я сейчас получаю:

Project1.cpp: 107: ошибка: запрос на член getCurrentHealth' in slime ', который имеет неклассовый тип `greenSlime () ()'

Наряду с другими ошибками того же типа.

Tl; Dr: Реализация класса не работает, разместил весь мой источник, когда я, вероятно, мог бы опубликовать около 1/10 этого и все еще имел смысл, и хотел бы, чтобы кто-то сказал мне, почему он не работает и как я плохой.

Ответы [ 5 ]

3 голосов
/ 06 января 2012

Проблема в том, что компилятор считает, что строка объявления слизи - это еще один тип предварительного объявления, поскольку у greenSlime нет ctor с параметрами.

Это можно исправить, не ставя скобки после слизи.

// greenSlime slime();
greenSlime slime;

Вот самый лучший совет, который я могу дать относительно странных ошибок, которые вы не понимаете.Приведите меньший пример проблемы, чтобы легче было понять, что на самом деле не так.

Вот что я написал для проверки.

struct Foo {
    Foo() {}
    void bar() {}
};

int main(int argc, char ** argv) {
    Foo foo;
    foo.bar();
    return 0;
}
1 голос
/ 06 января 2012

Другие указали на проблемы с точки зрения того, почему ваш код не работает. Я сделаю рекомендацию по разработке программы.

При объяснении наследования в учебниках и классах программирования часто используются игрушечные примеры, которые очень похожи на ваш код. Эти примеры показывают, что такое наследование, но на самом деле не очень хорошо показывают, для чего полезно наследование.

Я бы не использовал наследование в этом случае. Я думаю, что лучший дизайн - это иметь класс, который представляет тип моба и содержит все статические данные для всего этого моба этого типа, такие как имя моба, начальный / максимальный HP, типы атак и т. Д. другой класс, где каждый экземпляр представляет конкретного моба и содержит данные, которые изменяются для этого моба, такие как текущий hp.

class Mob_type {
    string name;
    int max_hp;
    vector<shared_ptr<Attack_type>> attacks;
public:
    Mob_type(string name,int max_hp,vector<shared_ptr<Attack_type>> attacks)
    : name(name),max_hp(max_hp),attacks(attacks) {}
    int get_max_hp() const { return max_hp; }
};

class Mob {
    Mob_type const &type;
    int hp;
public:
    Mob(Mob_type const &type) : type(type), hp(type.get_max_hp()) {}
    Mob_type const &get_type() const { return type; }
    int get_hp() const { return hp; }
};

void print_health(Mob const &m) {
    cout << m.get_hp() << '/' << m.get_type().get_max_hp() << '\n';
}

int main() {
    vector<shared_ptr<Attack_type>> attacks; // ...
    Mob_type green_slime("Green Slime",50,attacks);

    Mob green_slime_A(green_slime), green_slime_B(green_slime);

    fight(green_slime_A,green_slime_B);

    cout << "A: ";
    print_health(green_slime_A);
    cout << "B: ";
    print_health(green_slime_B);

}

Таким образом, вы можете получить файл данных, содержащий типы мобов, и все, что вам нужно сделать, чтобы добавить тип, это обновить файл данных.

1 голос
/ 06 января 2012

Кроме того, я думаю, вы столкнетесь со следующей вещью: вы почти никогда не захотите частного наследования , по крайней мере, если вы не знаете , что вы действительно этого хотите.Я предполагаю, что вы хотели, чтобы объявление класса greenSlime было class greenSlime: public baseMob

1 голос
/ 06 января 2012
class greenSlime: private baseMob{

должно быть:

class greenSlime: public baseMob{

Так как класс, от которого вы наследуете, является private , вы не сможете увидеть ни один из унаследованных методов.

Кроме того, как сказал Том Керр, вам не нужны скобки после того, как вы объявите свой объект.По сути, если вам не нужны какие-либо параметры, не используйте скобки при создании объекта.

0 голосов
/ 06 января 2012

Прежде всего, если вы сделаете частное наследование, вы не сможете получить доступ ни к одной из функций базового класса. Открытое наследование позволяет получить доступ к открытым и защищенным функциям и членам базового класса.

Во-вторых, если вы хотите создать указатель на класс greenSlime, вы должны сделать:

//greenSlime() with parentheses
greenSlime *slime = new greenSlime();

Но если вы хотите создать объект greenSlime с помощью конструктора без параметров (конструктор по умолчанию), вы должны сделать:

//without parentheses
greenSlime slime;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...