如何在C ++中声明后初始化n大小的数组

时间:2016-03-05 16:23:04

标签: c++ arrays initialization

我在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教程中,它并没有说我是怎么做到的。有办法吗?如果是这样,怎么样?

2 个答案:

答案 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_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