为std矢量对象重载operator []时出错

时间:2014-02-10 16:52:36

标签: c++

我有一个像这样定义的多边形类:

#include <gVector3.h>   // an array containing three floats (x,y,z coordinates)
#include <vector>

class Polygon {

private:

    std::vector <gVector3> vertices;
    std::vector <gVector3> color;

我像这样重载了这个类的[]运算符

gVector3 Polygon::operator [](unsigned int i) const {
    return vertices[i];
}

我写了一个简单的测试用例:

gVector3 v1(0,0,1), v2(1,1,1), v3(2,0,1);
Polygon *p = new Polygon();
p->push(v1);
p->push(v2);
p->push(v3);
assert(p[0] == v1);   // Assume == for the gVector3 class has been defined correctly

推送定义如下..

void Polygon::push(gVector3 vec){
    this->vertices.push_back(vec);
}

底线是这个断言失败了,我不知道为什么。也许我在滥用Vector类索引方法?

任何见解都会有所帮助!

2 个答案:

答案 0 :(得分:1)

p是一个指针,因此p[0]是它所指向的Polygon。我很惊讶它汇编了;我猜必须有一些奇怪的隐式类型转换。

你几乎肯定不想乱搞指针和new

Polygon p;
p.push(v1);
p.push(v2);
p.push(v3);
assert(p[0] == v1);

但是如果你出于某种原因这样做,那么在应用[]之前你需要取消引用指针

assert((*p)[0] == v1);

答案 1 :(得分:0)

p[0]相当于*(p + 0),或仅*p,所以它只是为您提供了您分配的Polygon对象。您没有在该对象上调用operator[]。您需要改为(*p)[0],这将首先获取Polygon对象,然后调用operator[]