对象的向量,每个对象都将其提供给其成员
Vector of objects, which each give this, to it's members
我有两个类,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();
这就解决了问题。但是我想知道这是不是一个不好的做法。
如果vector
在push_back
中没有足够的空间,它将调整大小,使指向vector
中先前存在的任何值的指针无效。
你需要保留正确的数量,这样就不会发生大小调整,或者存储指向值的指针,而不是值本身。
如果使用指针路径,最好存储unique_pointer
相关文章:
- 指向设备对象成员的指针
- 访问由unique_ptr传递的对象成员
- 引用对象成员函数的成员函数
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- Lua C API - 从C++分配和使用类的对象成员
- Rapidjson 遍历并获取复杂 JSON 对象成员的值
- 类对象成员变量在调用函数时不会更改
- 对象成员变量还是继承
- C++多态性:有没有办法找到对象成员函数的地址?
- 重载对象成员的比较运算符
- 获取未初始化对象成员的地址是否定义良好?
- 在优先级队列被推送到队列后,如何编辑对象成员
- 为什么在这里调用析构函数,以及在调用该对象析构函数后如何调用对象成员函数?
- 通过 std::bind 从对象成员检索值
- 保留对象成员变量的本地副本
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- 没有默认构造函数的对象成员的 wig setter
- 对象成员数组C++默认初始化
- 如何在数组中添加对象成员
- 使用聚合创建和关联两个不同的对象成员