我在C ++中制作基于文本的RPG类型的东西,而我正在制作 Inventory 类。这是我的代码:
class Inventory {
public:
int size;
Item items[];
Inventory(int size): size(size) {
}
};
在构造函数中,我需要将items
设置为长度为Item
的数组this.items = new Item[size]
。我知道在Java中,我只是做{{1}},但我一直在寻找一段时间,甚至在cplusplus.com教程中,它并没有说我是怎么做到的。有办法吗?如果是这样,怎么样?
答案 0 :(得分:2)
C ++不支持原始数组。 c ++中的目标是改为使用std::vector<Item>
:
class Inventory {
public:
int size;
std::vector<Item> items;
Inventory(int size): size(size), items(size) {
}
};
答案 1 :(得分:2)
使用std::vector<Item>
是唯一合理的解决方案。
在对另一个答案的评论中,您正在添加以下信息:
然而,一个问题是我需要限制尺寸。我能这样做吗 用向量或我必须手动限制它(例如不要让它 一旦它太大,就向矢量添加更多项目
std::vector
本身就是无限的。唯一真正的限制是可用内存。
但是你应该养成封装容器类的习惯。通常,容器类提供的功能比您在某个特定用例中所需的功能更多。例如,您的items
成员变量可能永远不会需要rbegin()
,cend()
,shrink_to_fit()
,difference_type
,get_allocator()
或pop_back()
,仅举几个例子。
因此,最好创建一种自定义数据类型,该类型仅提供您真正需要的操作,并根据std::vector
实施自定义数据类型。然后实现其他约束变得微不足道。
示例:
#include <vector>
#include <string>
#include <stdexcept>
#include <exception>
#include <iostream>
// just a super-simple example:
struct Item {
std::string name;
};
// wraps std::vector<Item>:
class Items {
public:
Items(int max_size) :
max_size(max_size),
items()
{
}
void Add(Item const& item) {
if (static_cast<int>(items.size()) == max_size) {
throw std::runtime_error("too many items");
}
items.push_back(item);
}
Item Get(int index) const {
return items[index];
}
private:
int max_size;
std::vector<Item> items;
};
int main()
{
Items items(5);
try {
items.Add({ "sword" });
items.Add({ "shield" });
items.Add({ "torch" });
items.Add({ "axe" });
items.Add({ "boots" });
std::cout << items.Get(3).name << "\n";
items.Add({ "gloves" });
} catch (std::exception const& exc) {
std::cerr << exc.what() << "\n";
}
}
请注意,此示例使用异常来处理错误。这可能不适合您的用例;您可以考虑使用assert
。