无法访问类的向量成员

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 为空。你从来没有在里面放任何东西。所以,setTasksgetTasks 都什么都不做。你期待什么输出? (有多少项?) 你的向量是空的。尝试给它一个大小。例如,vector&lt;int&gt; 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&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 或在构造时指定大小,因为推回向量有时会由于重新分配而变慢。

【讨论】:

以上是关于无法访问类的向量成员的主要内容,如果未能解决你的问题,请参考以下文章

C++ 析构函数:无法访问类中声明的私有成员

静态成员函数无法访问类的受保护成员

无法在构造函数中访问类的继承成员

使用向量访问类的成员

我无法访问我的基类的受保护成员

为啥静态初始化程序中的 lambda 无法访问 VC++2013 中类的私有成员?