我有一个类 Thing
,它有一个构造函数 Thing::Thing()
和一个方法 Thing::print()
。我正在尝试创建 arrayOfVectors
,使数组中的每个 std::vector 的大小为 0。构造函数正确打印出每个 vector 的大小,但 print()
方法没有。
我尝试在数组中的每个 vector 上调用 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;
}
最佳答案
Thing::Thing() { std::vector<int> store[5]; ^^^^^^^^^^^^^^^^^^^^^^^^^
这是一个 vector 数组。它是一个自动变量。自动变量在创建它们的 block 的末尾被销毁。在这种情况下,本地数组在构造函数调用结束时被销毁。
class Thing { private: std::vector<int>* arrayOfVectors; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这是一个指向 vector 的指针。它不是数组。它是类 Thing
的成员变量。它是一个完全独立于本地 store
变量的变量。
您的构造函数从不初始化成员变量,因此当您在 print
成员函数中间接指针时,程序的行为是未定义的。
如果你想让你的类有一个数组作为成员变量,你可以这样写:
class Thing {
private:
std::vector<int> arrayOfVectors[5];
您无需声明构造函数,因为自动生成的构造函数完全符合您的要求 - 所有 vector 都将为空。
How can i avoid setting a specific number like 5 in the header definition?
您无法使用数组变量来避免这种情况。大小必须在编译时已知。如果你需要一个非固定大小的数组,你需要在动态存储中分配数组。创建动态数组的惯用方法是使用 std::vector
:
class Thing {
private:
std::vector<std::vector<int>> vectorOfVectors{5};
关于c++ - 初始化 vector 数组,其中每个 vector 的大小为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52808214/