标头中的c ++数组声明

时间:2008-11-26 20:46:37

标签: c++ arrays dynamic header

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

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

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

这可能或我应该使用动态数组吗?谢谢!

7 个答案:

答案 0 :(得分:17)

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

您可以使用矢量来获得相同的结果:

class Test
{
    std::vector<int> a;
    public:
        Test(std::size_t size):
            a(size)
        {}
};

答案 1 :(得分:13)

不,这是不可能的。标头中的数组声明必须具有恒定大小的值。否则,像“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);
};

答案 2 :(得分:4)

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

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

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

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

答案 3 :(得分:3)

首先,通常最好在构造函数的初始化列表中初始化事物,而不是在构造函数的主体中。

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

你必须记住,当对象被销毁或者你会得到内存泄漏时,有一个析构函数会删除数组。

答案 4 :(得分:2)

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

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

它保证可以正常工作,但前提是向量不为空(C ++怪癖,&lt; sigh&gt;)。

答案 5 :(得分:0)

不,这是不可能的。您应该使用动态数组,例如std::vector。 C99允许结构体只有一个未标准化的数组作为 last 成员,但即使你这样做,你仍然需要自己手动分配内存,例如:与malloc()

答案 6 :(得分:0)

你所谈论的是不可能的。类始终具有恒定的大小。您可以让您的类使用指向动态分配的数组的指针,或者您可以使用std :: vector。