如何在 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 设置为Items 的数组,其长度为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&lt;Item&gt; 是这里唯一的合理解决方案。

在对另一个答案的评论中,您正在添加以下信息:

然而,一个问题是我需要限制大小。我可以这样做吗 使用向量还是我必须手动限制它(例如不让它 一旦向量太大,向向量中添加更多项目)

std::vector 本身就是无限的。它唯一真正的限制是可用内存。

但无论如何你都应该养成封装容器类的习惯。通常,容器类提供的功能比您在一个特定用例中所需要的要多得多。例如,您的items 成员变量可能永远不需要rbegin()cend()shrink_to_fit()difference_typeget_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 大小的数组的主要内容,如果未能解决你的问题,请参考以下文章

动态初始化的数组大小示例

C++声明一个基于非常量变量的数组?

C++:使用函数为二维数组分配内存时出错

如何在 C++ 中找到数组的确切大小? [复制]

如何在 C++ 的主函数中为全局声明的 2d 向量分配大小?

如何在 C++ 中声明 10000 x 100000 大小的整数矩阵