从对象打印2D int矢量

时间:2015-09-23 16:09:48

标签: c++ class pointers

所以我很确定它有问题,因为它试图打印指针而不是价值,但我不知道如何修复它。

bool setPos(int pos)
{
    if ((pos >= 0) && (pos < listSize))
        fence = pos;
    return (pos >= 0) && (pos < listSize);
}

我在打印我在I级制作中使用的2d矢量时遇到问题。我收到一条错误消息:

class cName {
private:
    std::vector< std::vector<int>> *vect2d;
public:
    // initializes vector that contains x number of vectors
    // that each contain y number of ints
    cName(int x,int y); 
    void printVector(int);
}

void cName::printVector(int x) {
    for(int i=0; i<x; i++) {
        //have to get size because 
        // the number of ints in the vector will change
        for(int j=0; j< this->vect2d[i].size(); j++) 
            std::cout << this->vect2d[i][j]<<" ";
        std::cout<<"\n";
    }
}

问题:

有人可以解释一下,为什么要把这个错误扔给我并帮我修复它?

1 个答案:

答案 0 :(得分:1)

vect2d成员是指向int的向量向量的指针。你不需要这里的指针,只需使用整数向量的向量。

您对此指针的使用不会产生任何立即错误,因为下标运算符array[index]可用于指针。如果您不确定您的代码是否正确,请更喜欢对.at(index)个实例使用范围检查std::vector方法。使用显式方法会指向您的错误,因为指针没有.at(index)方法。

当您致电this->vect2d[i].size()时,编译器当前看到的是:

    类型为this->vect2d
  • vector<vector<int>>*,一种复杂的拼写方式vect2d。请注意,这是指针类型。
  • 类型为this->vect2d[i]
  • vector<vector<int>>,相当于*(vect2d + i),但不是(*vect2d)[i]vect2d->at(i)!请注意,这不是指针类型,但仍然是两个嵌套向量。
  • 因此,.size()会在距离您的外i容器*vect2d向量大小的向量上调用vect2d[i][j]。很可能,这是无效的内存,可能会出现段错误。

以后执行*(vect2d + i)[j]时,这实际上等同于(vect2d + i)->at(j),其行为应与vect2d->at(i).at(j)相同。但它不是vector<int>!值得注意的是,它的类型为int而不是operator<<。这是您的错误消息的原因:打印向量没有可用的size_t,因此编译器会产生相当难以理解的错误。