我有两个类,顶点和三角形。首先,我创建一个顶点场,然后从顶点场创建一个三角形面向量。每个顶点都需要一个指向与其相邻的每个三角形面的指针或引用。
这是我所拥有的简化示例,但它不起作用。
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();
这解决了这个问题。但我想知道这是否是一种不好的做法。