我有两个类,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();
这解决了这个问题。但我想知道这是不是一种不好的做法。
答案 0 :(得分:2)
如果vector
push_back
没有足够的空间,vector
它会调整大小,使之前unique_pointer
中任何值的指针无效。
您需要保留正确的金额,以便不必发生调整大小,或者存储指向值的指针,而不是值本身。
如果你去指针路线,你最好存储一个{{1}}