我想知道是否可以声明一个数组(此时未知的大小),作为类的私有成员,然后在类的构造函数中设置大小。例如:
class Test {
int a[];
public:
Test(int size);
};
Test::Test(int size) {
a[size]; // this is wrong, but what can i do here?
}
这可能或我应该使用动态数组吗?谢谢!
答案 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。