【问题标题】:How to initialize an n-sized array after declaration in C++如何在 C++ 中声明后初始化 n 大小的数组
【发布时间】: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 添加到实习向量/数组的方式。

标签: c++ arrays initialization


【解决方案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

【讨论】:

  • 好吧,你至少把它解释到最后。太好了(我现在太懒了)。来自巴伐利亚的问候,我亲爱的邻居。
  • @πάνταῥεῖ: 一定是我以前的助教精神 :) 谢谢!
猜你喜欢
  • 2013-12-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2021-04-15
相关资源
最近更新 更多