类对象指针的c ++向量

Nig*_*gel 1 c++ pointers reference class vector

我想要做的是基本上创建两个对象向量,其中一些对象被输入到两个列表中,一些对象被输入到一个对象中.我发现的第一个问题是,当我使用push_back()将对象添加到两个列表中时,对象被复制,这样当我从一个列表中更改它时,对象在另一个列表中没有改变.为了解决这个问题,我尝试创建一个指向对象的指针列表作为列表之一.但是,当我稍后访问指针时,数据似乎已损坏,数据成员值都是错误的.以下是我的代码的一些片段:

载体的定义:

vector<AbsorbMesh> meshList;
vector<AbsorbMesh*> absorbList;
Run Code Online (Sandbox Code Playgroud)

...向两者添加一个对象:

AbsorbMesh nurbsMesh = nurbs.CreateMesh(uStride, vStride);

// Add to the absorption list
absorbList.push_back(&nurbsMesh);
// Store the mesh in the scene list
meshList.push_back(nurbsMesh);
Run Code Online (Sandbox Code Playgroud)

访问对象:

if (absorbList.size() > 0)
{
float receivedPower = absorbList[0]->receivedPower;
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Gle*_*len 9

有一些细节缺失,但猜测.

nurbsMesh超出了push_back和之间的范围absorbList[0]->receivedPower.

所以现在你的指针向量包含一个指向不再存在的对象的指针.

尝试将复制构造函数添加到AbsorbMesh类并添加到您的矢量中.

absorbList.push_back(new AbsorbMesh(nurbsMesh));
meshList.push_back(nurbsMesh);
Run Code Online (Sandbox Code Playgroud)

不要忘了删除对象absorbList,像这样的

for(vector<AbsorbMesh*>::iterator it = absorbList.begin(); it != absorbList.end(); it++) {
    delete it;
  }
Run Code Online (Sandbox Code Playgroud)

或者在向量中存储共享指针而不是裸指针.如果你感兴趣的话,Boost有一个很好的共享指针实现.请参阅此处的文档

如果要在另一个向量中修改对象中的项目更新,则需要在两个向量中存储指针.

使用您的原始要求(更新一个向量中的项目会影响另一个向量中的项目,这是我如何使用boost共享指针执行此操作.(警告,未经测试的代码)

vector<boost::shared_ptr<AbsorbMesh> > meshList;
vector<boost::shared_ptr<AbsorbMesh> > absorbList;

boost::shared_ptr<AbsorbMesh> nurb = new AbsorbMesh(nurbs.CreateMesh(uStride, vStride));

meshList.push_back(nurb);
absorbList.push_back(nurb);

...
...

if (absorbList.size() > 0)
{
    float receivedPower = absorbList[0].get()->receivedPower;
}
Run Code Online (Sandbox Code Playgroud)


Nav*_*een 6

您正在存储堆栈上分配的对象的地址.nurbsMesh一旦你的方法push_back()结束,对象就会被破坏.如果您之后尝试访问此指针,则该对象已被销毁并包含垃圾.您需要的是保留即使在功能超出范围后仍然存在的对象.为此,请使用从堆中为对象分配内存new.但对于每一个新的你应该有一个相应的delete.但是在你的情况下,当你将相同的指针推入两个向量时,你会有删除它的问题.要解决这个问题,您需要一些类型引用计数机制.