无法访问类的向量成员
Posted
技术标签:
【中文标题】无法访问类的向量成员【英文标题】:cannot access the vector members of a class 【发布时间】:2015-01-29 15:50:52 【问题描述】:我试图访问Part
类的成员,它们是向量tasks
内的整数类型的向量元素。
#include <iostream>
#include <vector>
using namespace std;
class Part
vector<int> tasks;
public:
void setTasks(void);
void getTasks(void);
;
void Part::setTasks(void)
vector<int>::iterator it;
int i=1;
for (it = this->tasks.begin(); it != this->tasks.end(); ++it)
*it=i;
i=i+1;
void Part::getTasks(void)
vector<int>::iterator it;
for (it = this->tasks.begin(); it != this->tasks.end(); ++it)
cout<<*it<<"\t";
int main()
Part one;
one.setTasks();
one.getTasks();
return 0;
我只是试图访问这些值并打印它们但失败了。没有编译错误。在运行时,终端中不输出任何内容。哪里出错了?
【问题讨论】:
tasks
为空。你从来没有在里面放任何东西。所以,setTasks
和 getTasks
都什么都不做。你期待什么输出? (有多少项?)
你的向量是空的。尝试给它一个大小。例如,vector<int> tasks(10)
。见option 3 in this。
如果你想要一个类似数组的东西,但更多的是 C++y,你应该看看std::array
。 (顺便说一句,(void)
是 C 的东西,在 C++ 中不是必需的,也不推荐使用。)
【参考方案1】:
默认构造的vector
大小为零,因此永远不会进入setTasks
中的for
循环(因为此时begin()
和end()
迭代器相同)。如果您将初始大小设置为vector
,您的代码将按预期工作。例如,尝试在setTasks
的开头添加以下内容
tasks.resize(10); // sets vector size to 10 elements, each initialized to 0
编写该函数的另一种方法是
#include <numeric>
...
void Part::setTasks(void)
tasks.resize(10);
std::iota(tasks.begin(), tasks.end(), 1); // requires C++11
如果您愿意,您还可以在Part
的默认构造函数中设置vector
的初始大小。在这种情况下,添加以下公共构造函数
Part() : tasks(10)
另一种在构造时设置大小的方法是
class Part
vector<int> tasks = vector<int>(10); // requires C++11
【讨论】:
为什么不直接使用默认构造函数? @0x499602D2 你的意思是在构造函数中设置初始大小?当然可以,我假设 OP 希望仅在调用setTasks
时才设置 vector
大小。
@Praetorian 如果不确定他想分配多少空间来规避尺寸过小或过大的风险,push_back
是理想的,对吧?我要求确认,因为它没有被提及。
@Praetorian 我也可以这样做:vector<int> tasks(10)
正如 Daniel Le 所指出的那样。
@userzizzy push_back
将在您向vector
添加新元素时根据需要重新分配存储空间。如果您知道需要多少存储空间,那么调用reserve
后跟push_back
可以帮助避免重复分配。【参考方案2】:
当您调用setTasks()
时,向量的大小为0。您的迭代器根本不会让您进入 for 循环。您需要考虑您究竟希望您的setTasks()
做什么。您打算设置向量的多少个元素?您应该使用该大小定义您的向量,或者使用那么多数量的push_back
s 来将您的向量设置为所需的值。
【讨论】:
【参考方案3】:你的向量是空的。尝试给它一个大小。例如,vector<int> tasks(10)
。见option 3 in this。
【讨论】:
【参考方案4】:或者,您可以使用“反向插入”迭代器 (#include <iterator>
),它在内部调用 std::vector::push_back
,如下所示:
void Part::setTasks(void)
auto back_it = std::back_inserter(tasks);
for(int i = 0; i < 10; ++i)
*back_it++ = i;
这种迭代器在目标大小未知的算法中特别有用。虽然如果您事先知道大小,您应该使用reserve/resize
或在构造时指定大小,因为推回向量有时会由于重新分配而变慢。
【讨论】:
以上是关于无法访问类的向量成员的主要内容,如果未能解决你的问题,请参考以下文章