如何在运行时定义成员数组大小

3

假设我有一个包含数组成员的类。是否可以通过以下方式在构造/运行时定义其大小:

class myClass {
    private:
        int myArray[n]
    public:
        myClass();
        someOtherMethod();
};

n是基于用户输入定义的变量。如果没有,最好的替代方案是什么?

3个回答

10

这得看情况。

从语义上分,有以下3种数组类型:

  • 在编译时大小已固定的数组
  • 在运行时大小已固定的数组
  • 大小是动态的数组

C++ 直接支持第一种和第三种情况,分别是普通数组和 std::vector 类。

C 也支持第二种类型,采用两种结构:

  • 可变长度数组(放在栈上)
  • 旧版的 struct hack 或者 尾部填充

我建议在你的情况下,在 C++ 中使用 std::vector 类。它提供了比你所需更多的功能,但使用起来更简单。

另一方面,在 C++ 中仍然可以使用尾部填充,不过需要仔细的工程设计。


4
使用向量。
class myClass {
    private:
        std::vector<int> myArray;
    public:
        myClass();
        someOtherMethod();
};

myClass::myClass (int size)
    : myArray (size)
{ 
    ...
}

然后,您可以像填充数组一样填充向量。或者,如Nawaz所指出的那样,使用reserve(),该函数保留新元素的空间,和/或push_back()用于逐个添加元素到末尾。


为什么要使用 resize()?而不是 reserve() - Nawaz
@Nawaz,取决于您如何填充它。两种都可以,尽管您可以使用 resize() 像数组一样填充它。 - chris
如果您使用 resize(),为什么不使用 mem-initializer-list 来编写 myClass::myClass (int size) : myArray(size) {} 呢?这样会更好。 - Nawaz
@Nawaz,没错。这确实没有增加任何复杂性。我会修复它的。 - chris

1

为此目的设计的类模板是 std::vector

class myClass {
    private:
        std::vector<int> myArray;
    public:
        myClass(int size);
        someOtherMethod();
};

myClass::myClass(int size) : myArray(size)
{
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接