c++ - 初始化向量数组,其中每个向量的大小为 0
问题描述
我有一个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;
}
解决方案
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};
推荐阅读
- python - 从 python 运行命令行以生成条形码
- java - java泛型与vs
- swift - FirebaseAuth 未通过 Google 身份验证创建新用户 - Swift
- regression - 之间的区别。和 1 在 glm
- python - 从其他类访问类对象
- python - 在 anaconda 上安装 cx_freeze 时出现包冲突
- php - 如何使用 php 中的 password_hash 函数对 1000 个或更多字符的令牌进行哈希处理?
- c# - Sitecore 项目:安装包时未调用已保存的事件处理程序
- haskell - cabal 在 mac 中全局安装包在哪里?
- sql - SQL where 列表中的元组