如何将对象指针与动态数组一起使用

时间:2018-11-26 09:48:49

标签: c++ polymorphism abstract-class dynamic-arrays

你好,我正在研究c ++语言,我真的很想知道是否将对象指针与动态数组一起使用。武器类是由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 :(得分:2)

示例代码:

#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,它对资源管理有很大帮助,并且易于使用。没有它,您需要手动从vector中删除所有元素。我真的建议使用它。

我们的BaseItem现在可以提供我们要在任何其他类中实现的“接口”。如果您不想强迫类实现这种方法,就不要使其成为纯虚拟的(删除= 0并添加{}函数体)

有关以下信息的更多信息:

这是一种“旧”方法。您还可以阅读有关组成和实体系统(ES)的信息。