12

我想知道是否可以将数组(此时大小未知)声明为类的私有成员,然后在类的构造函数中设置大小。例如:

class Test {
int a[];
public:
Test(int size);
};

Test::Test(int size) {
a[size];   // this is wrong, but what can i do here?
}

这是可能的还是我应该使用动态数组?谢谢!

4

7 回答 7

17

简短答案:否(数组的大小仅在编译时定义)
长答案:

您可以使用向量来实现相同的结果:

class Test
{
    std::vector<int> a;
    public:
        Test(std::size_t size):
            a(size)
        {}
};
于 2008-11-26T20:48:57.770 回答
16

不,这是不可能的。标头中的数组声明必须具有恒定大小的值。否则,像“sizeof”这样的结构就不可能正常工作。您需要将数组声明为指针类型并在构造函数中使用 new[]。例子。

class Test { 
    int *a;
public:
    Test(int size) {
       a = new int[size];
    }
    ~Test() { delete [] a; }
private:
    Test(const Test& other);
    Test& operator=(const Test& other);
};
于 2008-11-26T20:49:24.460 回答
4

正如其他答案所指出的,数组的大小在编译时是固定的。但是,通过使用模板,您可以在编译时参数化大小:

template <int N> class Test {
    int a[N];
public:
    Test() { }
};

Test<5> test;
Test<40> biggertest;

此技术不允许您在运行时计算大小(如动态std::vector解决方案所做的那样),但根据您的需要,这可能就足够了。

于 2008-11-26T20:52:01.257 回答
3

首先,一般最好在构造函数的初始化列表中初始化东西,而不是在构造函数的主体中。

如果您在编译时知道该边界,则只能使用预定义的边界初始化数组。在这种情况下,您将需要动态分配空间。

你必须记住有一个析构函数,它会在对象被销毁时删除数组,否则你会发生内存泄漏。

于 2008-11-26T20:48:55.787 回答
2

请参阅 Martin 的解决方案(使用std::vector),并记住,即使您需要将缓冲区传递给 C API std::vector,您也可以通过传递&vec[0]

std::vector<char> vec(10);
memset(&vec[0], 0, vec.size());

它保证可以工作,但前提是向量不为空(C++ 怪癖,<sigh>)。

于 2008-11-26T21:08:01.037 回答
0

不,这是不可能的。您应该使用动态数组,例如std::vector. C99 允许结构仅将一个未调整大小的数组作为最后一个成员,但即使您这样做,您仍然必须自己手动分配内存,例如使用malloc().

于 2008-11-26T20:49:39.140 回答
0

你说的这些是不可能的。类的大小始终不变。您可以让您的类使用指向动态分配的数组的指针,也可以使用 std::vector。

于 2008-11-26T20:58:11.823 回答