如何在 C++ 中声明后初始化 n 大小的数组
Posted
技术标签:
【中文标题】如何在 C++ 中声明后初始化 n 大小的数组【英文标题】:How to initialize an n-sized array after declaration in C++ 【发布时间】:2016-03-05 16:23:04 【问题描述】:我正在用 C++ 制作一个基于文本的 RPG 类的东西,并且我正在制作 Inventory 类。这是我的代码:
class Inventory
public:
int size;
Item items[];
Inventory(int size): size(size)
;
在构造函数中,我需要将items
设置为Item
s 的数组,其长度为size。我知道在 Java 中,我只会做this.items = new Item[size]
,但我已经找了一段时间了,甚至在 cplusplus.com 教程上,它也没有说明我将如何做到这一点。有办法吗?如果有,怎么做?
【问题讨论】:
你不能,改用std::vector<Item> items;
。
好的,谢谢,我试试。然而,一个问题是我需要限制大小。我可以用向量来做到这一点还是必须手动限制它(例如,一旦向量太大,就不让它向向量中添加更多项目)
取决于您实际将Items
添加到实习向量/数组的方式。
【参考方案1】:
C++ 不支持关于原始数组的这一点。 c++ 中的预期是使用 std::vector<Item>
代替:
class Inventory
public:
int size;
std::vector<Item> items;
Inventory(int size): size(size), items(size)
;
【讨论】:
我们为什么要选择矢量?我们可以通过简单的“新建”和“删除”来解决这个问题,对吧? @GilsonPJ 获得new
/delete
权利是复杂的,并且充满了你从未想过的陷阱。 c++ 标准容器类旨在为您克服所有这些问题。没有必要一直重新发明***。
动态分配似乎有点夸张
@πάντα ῥεῖ 如果我要使用它,我是否必须初始化items
?如果是这样,如何
@ZacGarby:Java 的 new
比 C++ 的 new
做得更多。非常不幸的是,Java 的发明者认为从 C++ 复制关键字是个好主意。它在学习 C++ 的 Java 程序员中引起了无尽的困惑。【参考方案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
。
【讨论】:
好吧,你至少把它解释到最后。太好了(我现在太懒了)。来自巴伐利亚的问候,我亲爱的邻居。 @πάνταῥεῖ: 一定是我以前的助教精神 :) 谢谢!以上是关于如何在 C++ 中声明后初始化 n 大小的数组的主要内容,如果未能解决你的问题,请参考以下文章