对象的向量,每个对象都将其提供给其成员

Vector of objects, which each give this, to it's members

本文关键字:对象 成员 向量      更新时间:2023-10-16

我有两个类,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是指向顶点对象的有效指针。

当我尝试从顶点访问三角形时,像这样,

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

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

如果vectorpush_back中没有足够的空间,它将调整大小,使指向vector中先前存在的任何值的指针无效。

你需要保留正确的数量,这样就不会发生大小调整,或者存储指向值的指针,而不是值本身。

如果使用指针路径,最好存储unique_pointer