【发布时间】:2010-09-24 05:44:06
【问题描述】:
我想知道是否可以将数组(此时大小未知)声明为类的私有成员,然后在类的构造函数中设置大小。例如:
class Test {
int a[];
public:
Test(int size);
};
Test::Test(int size) {
a[size]; // this is wrong, but what can i do here?
}
这可能还是我应该使用动态数组?谢谢!
【问题讨论】:
我想知道是否可以将数组(此时大小未知)声明为类的私有成员,然后在类的构造函数中设置大小。例如:
class Test {
int a[];
public:
Test(int size);
};
Test::Test(int size) {
a[size]; // this is wrong, but what can i do here?
}
这可能还是我应该使用动态数组?谢谢!
【问题讨论】:
简短回答:否(数组的大小仅在编译时定义)
长答案:
你可以使用一个向量来达到同样的效果:
class Test
{
std::vector<int> a;
public:
Test(std::size_t size):
a(size)
{}
};
【讨论】:
不,这是不可能的。标头中的数组声明必须具有恒定大小的值。否则,像“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);
};
【讨论】:
正如其他答案所指出的,数组的大小在编译时是固定的。但是,通过使用模板,您可以在编译时参数化大小:
template <int N> class Test {
int a[N];
public:
Test() { }
};
Test<5> test;
Test<40> biggertest;
此技术不允许您在运行时计算大小(如动态std::vector 解决方案所做的那样),但根据您的需要,这可能就足够了。
【讨论】:
首先,一般最好在构造函数的初始化列表中初始化东西,而不是在构造函数的主体中。
如果您在编译时知道该边界,则只能使用预定义的边界初始化数组。在这种情况下,您需要动态分配空间。
你必须记住要有一个析构函数,它会在对象被销毁时删除数组,否则会导致内存泄漏。
【讨论】:
请参阅 Martin 的解决方案(使用 std::vector),并记住,即使您需要将缓冲区传递给 C API,std::vector 也可以通过传递 &vec[0] 来实现:
std::vector<char> vec(10);
memset(&vec[0], 0, vec.size());
保证可以工作,但前提是向量不为空(C++ 怪癖,
【讨论】:
不,这是不可能的。您应该使用动态数组,例如std::vector。 C99 允许结构只有一个未调整大小的数组作为 last 成员,但即使这样做,您仍然必须自己手动分配内存,例如malloc()。
【讨论】:
你说的是不可能的。类总是有一个恒定的大小。您可以让您的类使用指向动态分配数组的指针,或者您可以使用 std::vector。
【讨论】: