-3

我有两个类,顶点和三角形。首先,我创建一个顶点场,然后从顶点场创建一个三角形面向量。每个顶点都需要一个指向与其相邻的每个三角形面的指针或引用。

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

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;

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

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

谢谢你的时间。

编辑:

只是想更清楚地说明我的要求。我对为什么代码不起作用的分析是否正确?你觉得这怎么样?

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();

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

4

1 回答 1

2

如果在调整大小vector时 a 没有足够的空间push_back,则使指向vector先前任何值的指针无效。

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

如果你走指针路线,你最好存储一个unique_pointer

于 2013-06-10T07:00:26.253 回答