所以我很确定它有问题,因为它试图打印指针而不是价值,但我不知道如何修复它。
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";
}
}
有人可以解释一下,为什么要把这个错误扔给我并帮我修复它?
答案 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
,因此编译器会产生相当难以理解的错误。