带有自定义对象的C 数组
C++ array with custom objects
在搜索Google和Stackoverflow 2天后,我还没有找到任何东西
我已经与Java合作了大约一年,我决定在C 上创建一个练习
在Java中,这应该有效,但在C 中它震撼了我的想法。
我有这个代码
Item* inventory = new Item[24];
是持有项目的数组(库存)
当我动态分配数组时,所有柱子的帖子都是空的?如果没有,我可以使它们全部无效吗?
这就是在第一个空位置上添加项目的代码(拿起一个项目)
void Inventory::addItem(Item it){
if(isFull()){
cout << "Full inventory" << endl;
}else{
for(int i = 0; i<length; i++){
if(inventory[i] == nullptr){ // need this to work somehow
inventory[i] = it;
}
}
}
}
它需要是数组而不是矢量,因为它具有固定的大小
当我动态分配数组时,所有柱子的帖子都是空的?如果没有,我可以使它们全部无效吗?
像Java中的C 中没有这样的东西。您可以使用nullptr
指针。在您的情况下,对象是默认的,因此不是null。
它需要是数组而不是矢量,因为它具有固定的大小
您通常不想动态分配,除非严格必要。如果您真的想要固定尺寸的数组,请使用std::array
。
我建议的是将std::array
与std::unique_ptr
结合使用:
std::array<std::unique_ptr<Item>, 24> arr;
默认情况下,所有std::unique_ptr
s均为nullptr
。当您需要分配一个对象时,您将可以执行:
arr[i] = std::unique_ptr<Item>(new Item(...));
您甚至可以为智能指针创建一个别名:
using item_ptr = std::unique_ptr<Item>;
这将帮助您将代码重写为:
std::array<item_ptr, 24> arr;
arr[0] = item_ptr(new Item(...));
另外,您也可以使用boost::optional
(或C 中的std::optional
):
std::array<std::optional<Item>> arr;
您将能够检查特定的i
元素是否为" null"(在Java sense)中:
if (arr[i])
// not null
,您将能够分配一个值:
arr[i] = Item(...);
并用*arr[i]
,arr[i]->member_function(...);
或arr[i]->member_object
。
与您的最终评论相反,这似乎是std::vector
的一个完全合理的应用。
现在,您正在尝试创建一个n个对象的数组,但是其中一些m实际上是null/empty/nonsement obsistent对象。
现实是,这完全是完全是固定尺寸的集合。这是一个可变尺寸的集合,可达到指定的最大值。在给定的时间,玩家可能携带1个或10个项目,但是他们可以携带的最大数量。但是,它们不是,但是,不断携带最大数量的项目,其中一些恰好是null项目 1 。
。由于您要处理的是一个可变大小的集合(最多最大值),因此std::vector
非常适合该帐单。由于您正在处理Item
类,因此假设实际项目将是源自Item
的具体类实例。在这种情况下,您确实需要在数组中存储(某些多种指针),而不是实际的项目对象(否则,您尝试放入数组中的每个派生的项目都会被"切成切片"才能成为实际项目对象,而不是派生对象,当它存储在数组中时)。
you can 通过创建unique_ptr
S的集合(或其他各种其他智能指针类型,例如shared_ptr
),但是我一般通常建议在这种情况您考虑了Boost ptr_vector
类型。
就实施尺寸限制而言,您可能想创建一个小型包装类别来处理它。这并不是一项复杂的任务,但是最好将该代码集中到一个地方,而不是在任何地方复制大小检查代码,您可能会将项目添加到库存中。
template <class T>
class inventory {
ptr_vector<T *> items;
size_t max;
public:
inventory(size_t max) : max(max) {}
push_back(T *t) {
if (items.size() < max)
items.push_back(t);
}
// other miscellany here.
};
但是,您的不具有Item
s的多态性层次结构。取而代之的是,您只有一个固定的类型,用于清单中的所有项目,每个项目都有一个名称等。如果是这种情况(即,所有Item
s实际上都是相同类型的对象),则没有理由弄乱指针或ptr_vector
。您真的只想要std::vector<Item>
。但是,与上述非常相似,您无疑仍希望集中代码以强制库存的最大规模(并且可能还提供其他特定于库存的服务)。
- 如果您允许我进行题外话,那么有人会考虑这种可能性表明使用Java扭曲人们的思想的程度并破坏他们清楚思考的能力。为了解释Dijkstra,教爪哇应该是刑事犯罪。
- 销毁C++中动态分配的内存(数组对象)
- 数组对象的生存期是否在重用其元素存储时结束?
- 为什么顶点数组对象会导致错误?
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 这是使用构造函数初始化数组对象的最佳方法吗?
- OpenGL 顶点数组对象与 tinyobjloader
- 将数组/对象/结构列表从C#库中传递给C MFC应用程序
- C++ RapidJson 帮助反序列化数组对象
- ptrdiff_t可以表示指向同一数组对象元素的指针的所有减法吗?
- 检查成员函数是否返回临时对象或数组对象
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 当数组对象以函数参数传递时,为什么复制构造函数会自称
- 如何使用箭头指针打印出一类数组对象,这些对象中有多个分数
- C++17 std::shared_ptr<> 类数组对象的重载运算符 []
- 添加两个具有运算符重载的数组对象,从而导致分段错误
- opengl:两个不同的矢量可以绑定到同一个顶点数组对象吗
- 使用相同的数据填充数组对象或使用指针
- 方法用于最快的分配,并且不需要将动态大小的数组对象作为局部变量
- 如何将2d数组对象传递给c++中的函数
- ReferenceTable溢出(jni-android),数组对象释放