无法访问类的向量成员

时间:2015-01-29 15:50:52

标签: c++ class vector

我试图访问类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; } 的成员。

{{1}}

我只是试图访问这些值并打印它们但失败了。没有编译错误。在运行时,终端中没有输出任何内容。错误在哪里?

4 个答案:

答案 0 :(得分:3)

默认构造的vector大小为零,因此永远不会输入for中的setTasks循环(因为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
}

如果您愿意,还可以在vector的默认构造函数中设置Part的初始大小。在这种情况下,添加以下公共构造函数

Part() : tasks(10)
{}

另一种在施工时设定尺寸的方法是

class Part{
    vector<int> tasks = vector<int>(10); // requires C++11

答案 1 :(得分:1)

致电setTasks()时,向量的大小为0。你的迭代器根本不会让你进入for循环。您需要考虑您希望setTasks()做什么。您打算设置了多少元素?您应该使用该大小定义矢量,或者使用那么多push_back来代替将矢量设置为所需的值。

答案 2 :(得分:0)

你的矢量是空的。试着给它一个尺寸。例如,vector<int> tasks(10)。请参阅option 3 in this

答案 3 :(得分:0)

或者,你可以使用&#34; back-insert&#34;迭代器(#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或指定构造的大小,因为重新分配后推回到向量有时会很慢。