-3

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

問題を解決します。しかし、これが悪い習慣なのかどうか疑問に思っています。

4

1 に答える 1

2

vectorサイズを変更するときに十分なスペースがない場合push_back、以前にあった値へのポインターが無効になりますvector

サイズ変更が発生しないように正しい量を予約するか、値自体の代わりに値へのポインターを格納する必要があります。

ポインター ルートを使用する場合は、unique_pointer

于 2013-06-10T07:00:26.253 に答える