我有一个类Thing
和一个构造函数Thing::Thing()
和一个方法Thing::print()
。我正在尝试创建arrayOfVectors
,使数组内的每个std :: vector的大小均为0。构造函数正确打印出每个向量的大小,而print()
方法却没有。
我尝试在数组中的每个向量上调用arrayOfVectors[n].clear()
和arrayOfVectors[n].assign(0,0)
,但是没有用。
Thing.hpp
class Thing {
private:
std::vector<int>* arrayOfVectors;
public:
Thing();
void print() const;
};
Thing.cpp
Thing::Thing() {
std::vector<int> arrayOfVectors[5];
std::cout << arrayOfVectors[0].size() << std::endl; // 0
std::cout << arrayOfVectors[1].size() << std::endl; // 0
std::cout << arrayOfVectors[2].size() << std::endl; // 0
std::cout << arrayOfVectors[3].size() << std::endl; // 0
std::cout << arrayOfVectors[4].size() << std::endl; // 0
}
void Thing::print() const {
std::cout << arrayOfVectors[0].size() << std::endl; // 0
std::cout << arrayOfVectors[1].size() << std::endl; // 35183230189065
std::cout << arrayOfVectors[2].size() << std::endl; // 33
std::cout << arrayOfVectors[3].size() << std::endl; // 35
std::cout << arrayOfVectors[4].size() << std::endl; // 108
}
main.cpp
int main() {
Thing thing;
thing.print();
return 0;
}
答案 0 :(得分:3)
Thing::Thing() { std::vector<int> store[5]; ^^^^^^^^^^^^^^^^^^^^^^^^^
这是向量数组。它是一个自动变量。自动变量在创建它们的块的末尾销毁。在这种情况下,本地数组在构造函数调用的结尾被破坏。
class Thing { private: std::vector<int>* arrayOfVectors; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这是指向向量的指针。它不是数组。它是类Thing
的成员变量。它是与本地store
变量完全独立的变量。
您的构造函数从不初始化成员变量,因此当您在print
成员函数中间接指针时,程序的行为是不确定的。
如果希望您的类将数组作为成员变量,则可以这样编写:
class Thing {
private:
std::vector<int> arrayOfVectors[5];
您无需声明构造函数,因为自动生成的构造函数完全可以满足您的要求-所有向量均为空。
如何避免在标头定义中设置5之类的特定数字?
使用数组变量无法避免这种情况。在编译时必须知道大小。如果需要大小不固定的数组,则需要在动态存储中分配该数组。创建动态数组的惯用方式是使用std::vector
:
class Thing {
private:
std::vector<std::vector<int>> vectorOfVectors{5};