Vertex と Triangle の 2 つのクラスがあります。最初に頂点のフィールドを作成し、次に頂点フィールドから三角形の面のベクトルを作成します。各頂点には、それに隣接する各三角形面へのポインターまたは参照が必要です。
これは私が持っているものの単純化された例ですが、機能していません。
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 オブジェクトへの有効なポインターです。
このように、頂点から Triangle にアクセスしようとすると、
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();
問題を解決します。しかし、これが悪い習慣なのかどうか疑問に思っています。