Как использовать указатель объекта с динамическим массивом - PullRequest
0 голосов
/ 26 ноября 2018

Здравствуйте, я изучаю язык C ++, и мне действительно интересно, что если использовать объект Pointer с динамическим массивом.Класс оружия является производным от класса CItem.В настоящее время я печатаю вот так:

CItem* pItem = new cWeapon[m_size];

и инициализирую каждый объект следующим образом

pItem[0].initialize();
pItem[1].initialize();
pItem[2].initialize();
pItem[3].initialize();
....
pItem[n].initialize();

Однако в этот раз возникают проблемы.Размеры разные, PItem и CWeapon.Потому что операция указателя вызывает ошибку.и мне интересно, как решить эту проблему?

извините за мой дурацкий навык английского языка.

1 Ответ

0 голосов
/ 26 ноября 2018

Пример кода:

#include <iostream>
#include <memory>
#include <vector>

class BaseItem // abstract class
{
public:
    virtual void initialize() = 0; // pure virtual function (no implementation)
};

class Sword : public BaseItem
{
public:
    void initialize() override
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

class Shield : public BaseItem
{
public:
    void initialize() override
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

int main()
{
    std::vector<std::unique_ptr<BaseItem>> items;
    items.emplace_back(new Sword);
    items.emplace_back(new Sword);
    items.emplace_back(new Shield);
    items.emplace_back(new Sword);
    items.emplace_back(new Shield);

    for(auto& element : items)
    {
        element->initialize();
    }

    return 0;
}

Вы можете запустить его здесь: wandbox.org

Вывод:

virtual void Sword::initialize()
virtual void Sword::initialize()
virtual void Shield::initialize()
virtual void Sword::initialize()
virtual void Shield::initialize()

В этой реализацииЯ использовал std :: vector для динамических массивов.Вектор содержит типы интеллектуальных указателей на BaseItem.В этом случае умный указатель std :: unique_ptr очень помогает в управлении ресурсами и прост в использовании.Без этого вам нужно вручную удалить все элементы из вектора.Я действительно рекомендую использовать его.

Наш BaseItem теперь может предоставить «интерфейс», который мы хотим реализовать в любом другом классе.Если вы не хотите, чтобы класс реализовывал такой метод, просто не делайте его чисто виртуальным (удалите = 0 и добавьте {} тело функции)

Подробнее о:

Это своего рода "старый" подход.Вы также можете прочитать о композиции и системе сущностей (ES).

...