如何将对象指针与动态数组一起使用
How using object pointer with dynamic array
您好,我正在学习 C++ 语言,我真的很想知道是否将对象指针与动态数组一起使用。武器 class 由 CItem class 导出。这个时候我是这样打字的
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 for dynamic arrays. Vector is containing types of smart pointer to BaseItem. In this case smart pointer is std::unique_ptr它对资源管理有很大帮助,而且很容易使用。没有它,您需要手动删除 vector 中的所有元素。我真的推荐使用它。
我们的 BaseItem 现在可以提供我们想要在任何其他 class 中实现的 "interface"。如果你不想强制 class 实现这样的方法就不要让它成为纯虚拟的(删除 = 0
并添加 {}
函数体)
更多信息:
- C++ Abstract Class
__PRETTY_FUNCTION__
- C++ virtual functions
- C++ inheritance
这是一种 "old" 方法。您还可以阅读有关组合和实体系统 (ES) 的内容。
您好,我正在学习 C++ 语言,我真的很想知道是否将对象指针与动态数组一起使用。武器 class 由 CItem class 导出。这个时候我是这样打字的
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 for dynamic arrays. Vector is containing types of smart pointer to BaseItem. In this case smart pointer is std::unique_ptr它对资源管理有很大帮助,而且很容易使用。没有它,您需要手动删除 vector 中的所有元素。我真的推荐使用它。
我们的 BaseItem 现在可以提供我们想要在任何其他 class 中实现的 "interface"。如果你不想强制 class 实现这样的方法就不要让它成为纯虚拟的(删除 = 0
并添加 {}
函数体)
更多信息:
- C++ Abstract Class
__PRETTY_FUNCTION__
- C++ virtual functions
- C++ inheritance
这是一种 "old" 方法。您还可以阅读有关组合和实体系统 (ES) 的内容。