OOP инвентарная система; виртуальные / абстрактные классы - PullRequest
0 голосов
/ 27 апреля 2020

Я просто пишу простую систему инвентаря, которую хочу использовать для RPG-игры, и я застрял в начале. Я создал несколько классов: Предмет, Оружие и Меч. Где Оружие наследует от Предмета, а Меч - от Оружия. Я хочу сделать классы Предметов и Оружия виртуальными, но я действительно не знаю, вот код.

main. cpp

#include <iostream>
#include <vector>

#include "sword.hpp"

int main()
{
    using Item = Project::Item;
    using Sword = Project::Sword;

    std::vector<Item*> vec;

    vec.push_back(Sword(10));

    return 0;
}

item.hpp

#pragma once

namespace Project
{
    class Item
    {
    private:

    protected:

    public:
        virtual void abstract() = 0; //<- My idea, function that will just make this class abstract

        Item();
        virtual ~Item();
    };
}

вещь. cpp

#include "item.hpp"

namespace Project
{
    Item::Item()
    {

    }

    Item::~Item()
    {

    }
}

Weapon.HPP

#pragma once

#include "item.hpp"

namespace Project
{
    //Enum which will help me to identify all kinds of weapons
    //I used everywhere '_' prefix, because it won't conflict with normal classes
    enum WeaponId
    {
        _Sword = 0,
        _Axe = 1,
        _Bow = 2
    };

    class Weapon : public Item
    {
    private:

    protected:
        const WeaponId id;
        unsigned int damage;

    public:
        //<- Doesn't have declaration of 'abstract()', because it's virtual

        Weapon(const WeaponId& id, const unsigned int& damage = 0);
        virtual ~Weapon();
    };
}

Оружие. cpp

#include "weapon.hpp"

namespace Project
{
    Weapon::Weapon(const WeaponId& id, const unsigned int& damage)
        : Item(), id(id)
    {

    }

    Weapon::~Weapon()
    {

    }
}

Sword.hpp

#pragma once

#include "weapon.hpp"

namespace Project
{
    class Sword : public Weapon
    {
    private:

    public:
        void abstract() = 0; //<- Makes that this class isn't still an abstract class

        Sword(const unsigned int& damage);
        ~Sword();
    };
}

меч. cpp

#include "sword.hpp"

namespace Project
{
    Sword::Sword(const unsigned int& damage)
        : Weapon(WeaponId::_Sword, damage)
    {

    }

    Sword::~Sword()
    {

    }
}

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

...