我没有C ++的经验,我希望有一个类似于这个代码的行为,我将对同一个实例的一些引用推送到向量,并且我修改了一个字段的值实例。怎么可能在C ++中做到这一点?
目前我有这段代码但是向量中每个元素的值都是一个新副本,如何让向量中的所有元素引用同一个实例?
vector<MyClass> vectorABC;
MyClass a;
for (auto i = 0; i < 5; i++) {
if (i > 0) {
a = vectorABC.back();
} else {
a = MyClass();
}
a.field += 10;
vectorABC.push_back(a);
}
编辑:
有些人问了更多信息:
我想生成用于渲染圆锥的面/三角形,每个面/三角形有3个顶点,每个顶点有一个位置(x,y,z)和一个法线(x,y,z)。
渲染函数接收顶点矢量作为参数,每个3顶点渲染成三角形。
我想计算法线,因为它是解释它here。
圆锥中的所有面都与顶点,尖端共享一个,而另一个面与邻居共享。所以在我的循环中我计算位置和法线我希望能够保持对同一个对象的引用以更新顶点的法线值,这样顶点的法线就会考虑共享同一个顶点的所有表面
for (int i = 0; i < n_triangles; i++) {
// Calculate the positions of the 3 vertex
// Where the first v0 is the tip the second v1 is from the vector.back()
// and the third v2 is new
// ...
auto normal = cross(v2 - v0, v1 -v0);
v0.normal += normal;
v1.normal += normal;
v2.normal += normal;
vertices.push_back(v0);
vertices.push_back(v1);
vertices.push_back(v2);
}
for (auto& vertex : vertices) {
vertex.normal.normalize();
}
当我更新法线时,此代码不会更新v0的先前值,因为当我将它们插入向量时,它会复制顶点。正如我所说,我是c ++的新手,我不知道哪个是保持对同一个顶点实例的引用的最佳方法。
EDIT2:
正如Basya Perlman建议我使用智能指针实现了一个解决方案。像平滑算法需要两个循环:一个用于计算法线,另一个用于归一化法线向量,我使用第二个用于创建向量,我将返回到渲染函数。
vector<shared_ptr<MyClass>> vector_ptrs;
vector<MyClass> vertices;
shared_ptr<MyClass> v0, v1, v2, v3;
// ...
for (int i = 0; i < n_triangles; i++) {
// Calculate the positions of the 3 vertex
// Where the first v0 is the tip the second v1 is from the vector.back()
// and the third v2 is new
// ...
auto normal = cross(v2->position - v0->position, v1->position -v0->position);
v0->normal += normal;
v1->normal += normal;
v2->normal += normal;
vector_ptrs.push_back(v0);
vector_ptrs.push_back(v1);
vector_ptrs.push_back(v2);
}
for (auto& vertex : vector_ptrs) {
vertex->normal.normalize();
vertices.push_back(vertex);
}
感谢您的时间。在图片中你可以看到最终结果,我认为阴影非常平滑:)
答案 0 :(得分:2)
您可以为一个对象创建指针(或更好的智能指针),并创建(智能)指针的向量。这可能会达到你想要的效果。
通过添加的信息,我发现这只能部分帮助你 - 你可以指向相同的顶点,当你更新它们时它们都会改变,但你没有你需要的格式的矢量传递给您正在使用的渲染功能。
你可以有一个转换函数,它接收我描述的向量,循环它,并创建一个一次性的副本向量,只是为了传递给渲染函数。这应该工作。可能有更好的方法;如果我拿出它们,我会添加更多选项。