Классы, пространства имен и помощь в наследовании для игры D & D - PullRequest
2 голосов
/ 16 октября 2011

Итак, для класса мы должны сделать игру D & D 3.5, а для первого задания я должен сгенерировать персонажа Fighter. У меня в голове настроена иерархия: character.cpp, а дочерний - classname.cpp, где у него есть некоторые атрибуты, специфичные для класса, так как все классы имеют одни и те же базовые вещи.

Это хорошая структура для этого? Если это связано, мы еще не сделали STL.

Другая проблема, которая возникла в связи с тем, что мой товарищ по команде будет создавать графический интерфейс для игры, он также может создать класс, называемый персонажем. Я думал, чтобы решить это, я бы сделал пространство имен. Но если я сделаю так, чтобы каждый из создаваемых файлов имел свой класс внутри пространства имен d20 в каждом из соответствующих заголовков, все ли пространства имен были бы одинаковыми? Я не могу придумать очень хороший способ сформулировать этот вопрос.

Ответы [ 3 ]

4 голосов
/ 17 октября 2011

Вот мой лучший ответ на ваш вопрос ...

Хорошая структура наследования очень специфична для конкретного контекста, но основной принцип заключается в том, что базовый класс содержит данные и функции, относящиеся ко всем производным классам. Производные классы будут содержать конкретные данные и функции для себя. В вашем случае в базовом классе «персонаж» будет много данных, таких как все характеристики персонажа и функции, которые вычисляют результат на основе статистики (я предполагаю, что правила игры, как правило, не зависят от класса).

Я также предполагаю, что когда вы говорите «classname.cpp», вы имеете в виду «fighter.cpp», «cleric.cpp» и т. Д. В таком случае, да, я бы согласился с тем, чтобы это структурировалось таким образом.

STL на самом деле не имеет прямого отношения к созданию иерархий классов, поэтому я бы сказал, нет, это не связано.

Что касается пространств имен, то каждый раз, когда вы указываете пространство имен, оно будет таким же, как и везде, где вы указываете точно такое же имя (о чем я и спрашиваю). Вам не нужно делать ничего особенного, чтобы сделать его тем же пространством имен, кроме того, чтобы называть его одинаково точно. Простой пример выглядит следующим образом:

character.h

namespace d20
{
    class Character
    {
        Character();
        ~Character();
        //etc...
    }
}

character.cpp

#include "character.h"
namespace d20
{
    Character::Character()
    {
        // Stuff...
    }

    Character::~Character()
    {
    }
}

fighter.h

#include "character.h"
namespace d20
{
    class Fighter : public Character
    {
        Fighter ();
        ~Fighter ();
        //etc...
    }
}

ИЛИ (без ключевого слова пространства имен)

#include "character.h"
class Fighter : public d20::Character
{
    Fighter ();
    ~Fighter ();
    //etc...
}

Редактировать: Обратите внимание, что во втором случае класс Fighter НЕ является пространством имен d20, он просто происходит от класса в этом пространстве имен.

1 голос
/ 17 октября 2011

В вашем случае я бы порекомендовал против наследования, потому что наследование обычно используется двумя способами: где вы всегда используете базовый класс, и никогда не используете upcast, или используя наследование.Первое не то, что вы хотите, а второе может быть немного сложнее.(Также делает невозможным мультиклассирование) В конечном итоге очень общий класс character поможет вам продвинуться дальше.

namespace d20 {
    enum classtype {warrior_class, cleric_class, rogue_class, mage_class};
    class character {
        classtype charclass;
        int hp;
        int bab;
        int str;
        string get_name();
        void hit(character* enemy);
    };
}

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

namespace d20 {
    class character {
        int hp;
        int bab;
        int str;
        virtual string get_name() = 0;
        virtual void hit(character* enemy) const;
    };
}
namespace d20 {
    class fighter {
        string get_name() {return "Fighter";}
        void hit(character* enemy);
    }
}
0 голосов
/ 17 октября 2011

Это звучит как разумный подход ко мне. Предположительно classname.cpp s лучше назвать как-то как cleric.cpp, barbarian.cpp и т. Д.

Вы можете создать свой базовый класс с защищенной функцией, такой как «rollstats», чтобы возвращать строку, содержащую статистику. Дочерние классы могут затем переопределить это с помощью открытой rollstats функции, которая вызывает метод базового класса, а затем добавить дополнительную статистику.

Если ваш одноклассник создает GUI, он должен использовать ваши классы, не так ли? В этом случае он должен просто импортировать ваши файлы .h / .cpp, и нет необходимости беспокоиться о пространствах имен.

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