Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对象的向量,每个对象都给它';s成员_C++ - Fatal编程技术网

C++ 对象的向量,每个对象都给它';s成员

C++ 对象的向量,每个对象都给它';s成员,c++,C++,我有两个类,顶点和三角形。首先我创建一个顶点场,然后在顶点场外创建一个三角形面的向量。每个顶点都需要指向与其相邻的每个三角形面的指针或引用 这是一个简单的例子,我有,但它不工作 struct Vertex { float x, y, z; vector<Triangle*> adj_triangles; } struct Triangle { Vertex *v1; Vertex *v2; Vertex *v3; 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;
}
其中,v1、v2、v3当然是指向顶点对象的有效指针

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

triangles.push_back( Triangle ( 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);      
    }
}


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

如果
向量
在您
推回时没有足够的空间,它将重新调整大小,使指向先前
向量
中的任何值的指针无效

您需要保留正确的数量,以便不必调整大小,或者存储指向值的指针,而不是值本身


如果您选择指针路径,最好存储一个
唯一的\u指针

如何创建
v1、v2、v3
对象?它们的创建方式类似于
for(int i=0;i嗯,
Mesh
使用
vector
vector
来创建结构副本而不是指针。我没有得到我想要的@MVTC也许我错过了,但你到底想说什么呢?我很高兴我问了。我不知道这件事。虽然这并不是我遇到的问题的原因,但我确信这可能会在以后产生问题。如果我没有问的话,我会实施我的修复方案,而且可能从来都不知道这个挥之不去的问题。我使用了独特的ptr。谢谢
triangles.push_back( Triangle ( v1, v2, v3 ) );
triangles.back().give_address();