我想知道是否可以将数组(此时大小未知)声明为类的私有成员,然后在类的构造函数中设置大小。例如:
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++ 怪癖,<sigh>)。
不,这是不可能的。您应该使用动态数组,例如std::vector
. C99 允许结构仅将一个未调整大小的数组作为最后一个成员,但即使您这样做,您仍然必须自己手动分配内存,例如使用malloc()
.
你说的这些是不可能的。类的大小始终不变。您可以让您的类使用指向动态分配的数组的指针,也可以使用 std::vector。