矢量对象,每个都给它的成员

时间:2013-06-10 06:06:22

标签: c++

我有两个类,Vertex和Triangle。首先,我创建一个顶点字段,然后在顶点字段之外创建一个三角形面的矢量。每个顶点都需要一个指针或对与其相邻的每个三角形面的引用。

这是我所拥有的一个简化示例,但它不起作用。

struct Vertex {
    float x, y, z;
    vector<Triangle*> adj_triangles;
}

struct Triangle {
    Vertex *v1;
    Vertex *v2;
    Vertex *v3;

    Triangle(Vertex *v1_in, Vertex *v2_in, Vertex *v3_in) {
        v1 = v1_in;
        v2 = v2_in;
        v3 = v3_in;
        v1->adj_triangles.push_back(this);
        v2->adj_triangles.push_back(this);
        v3->adj_triangles.push_back(this);
    }
}

struct Mesh {
    vector< vector<Vertex> > field;
    vector< Triangle > triangles;
}

我这样填充,

triangles.push_back( Triangle ( v1, v2, v3 ) );

当然v1,v2,v3当然是Vertex对象的有效指针。

当我尝试从顶点访问三角形时,

v.adj_triangles[index]->member;

我没有得到我想要的东西。我想这可能是因为推回一个临时三角形首先创建临时的,根据它的指针初始化它的值。然后它被值复制并被销毁。因此每个顶点都有一个指向不再存在的对象的指针。

所以我想知道实现这个目标的方法是什么?我应该使用智能指针的向量吗?

谢谢你的时间。

修改

只是想让我更清楚我要求的是什么。我的分析为什么代码不正确?你怎么看待这个?

struct Triangle {
    Vertex *v1;
    Vertex *v2;
    Vertex *v3;

    Triangle(Vertex *v1_in, Vertex *v2_in, Vertex *v3_in) {
        v1 = v1_in;
        v2 = v2_in;
        v3 = v3_in;
    }
    void give_address() {
        v1->adj_triangles.push_back(this);
        v2->adj_triangles.push_back(this);
        v3->adj_triangles.push_back(this);      
    }
}

...

triangles.push_back( Triangle ( v1, v2, v3 ) );
triangles.back().give_address();

这解决了这个问题。但我想知道这是不是一种不好的做法。

1 个答案:

答案 0 :(得分:2)

如果vector push_back没有足够的空间,vector它会调整大小,使之前unique_pointer中任何值的指针无效。

您需要保留正确的金额,以便不必发生调整大小,或者存储指向值的指针,而不是值本身。

如果你去指针路线,你最好存储一个{{1}}