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

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

您好,我正在学习 C++ 语言,我真的想知道是否将对象指针与动态数组一起使用。 Weapon 类是由 CItem 类派生的。此时我正在这样打字。

CItem* pItem = new cWeapon[m_size];

我像这样初始化每个对象

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

然而这一次却出了问题。 pItem 和 cWeapon 的大小不同。因为指针操作会导致错误。 我想知道如何解决这个问题?

对不起我愚蠢的英语水平。

最佳答案

示例代码:

#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对于动态数组。 Vector 包含指向 BaseItem 的智能指针类型。在这种情况下,智能指针是 std::unique_ptr它对资源管理有很大帮助,而且易于使用。如果没有它,您需要手动删除 vector 中的所有元素。我真的推荐使用它。

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

更多信息:

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

关于c++ - 如何将对象指针与动态数组一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53478430/

相关文章:

c++ - Boost C++ 库安装

oop - OCaml 是否具有多态性?

java - Jackson 忽略抽象类的 xml 根元素

java - 继承同一父对象的两个对象交换了属性

c++ - 检测 Windows TDR 并从中恢复?

c++ - 在 C++ 中初始化引用不起作用,但初始化 const 引用却起作用,为什么?

c++ - 在C++中,我遇到无法理解的编译器错误

templates - 可扩展的临时多态性? (C++11)

java - 关于Java多态和转换的问题

c# - 是否可以在派生类或任何其他类中调用抽象类的方法