【问题标题】: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 为空。你从来没有在里面放任何东西。所以,setTasksgetTasks 都什么都不做。你期待什么输出? (有多少项?)
  • 你的向量是空的。尝试给它一个大小。例如,vector&lt;int&gt; tasks(10)。见option 3 in this
  • 如果你想要一个类似数组的东西,但更多的是 C++y,你应该看看std::array。 (顺便说一句,(void) 是 C 的东西,在 C++ 中不是必需的,也不推荐使用。)

标签: c++ class vector


【解决方案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&lt;int&gt; tasks(10) 正如 Daniel Le 所指出的那样。
  • @userzizzy push_back 将在您向vector 添加新元素时根据需要重新分配存储空间。如果您知道需要多少存储空间,那么调用reserve 后跟push_back 可以帮助避免重复分配。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你的向量是空的。尝试给它一个大小。例如,vector&lt;int&gt; tasks(10)。见option 3 in this

    【讨论】:

      【解决方案4】:

      或者,您可以使用“反向插入”迭代器 (#include &lt;iterator&gt;),它在内部调用 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 或在构造时指定大小,因为推回向量有时会由于重新分配而变慢。

      【讨论】:

        猜你喜欢
        • 2012-12-21
        • 2016-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多