C++ c++;类对象指针的向量

C++ c++;类对象指针的向量,c++,class,reference,vector,pointers,C++,Class,Reference,Vector,Pointers,我要做的是创建两个对象向量,其中一些对象被输入两个列表,而另一些只被输入一个列表。我发现的第一个问题是,当我使用push_back()将一个对象添加到两个列表中时,该对象被复制,因此当我从一个列表中更改它时,另一个列表中的对象没有更改。为了解决这个问题,我尝试创建一个指向对象的指针列表作为列表之一。但是,当我稍后访问指针时,数据似乎已损坏,数据成员值都是错误的。以下是我的一些代码片段: 向量的定义: vector<AbsorbMesh> meshList; vector<Abs

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

向量的定义:

vector<AbsorbMesh> meshList;
vector<AbsorbMesh*> absorbList;
访问对象:

if (absorbList.size() > 0)
{
float receivedPower = absorbList[0]->receivedPower;
}

我做错了什么?

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

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

缺少一些细节,但只是猜测而已

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

现在,指针向量包含一个指向不再存在的对象的指针

尝试向AbsorbMesh类中添加一个副本构造函数,然后像这样添加到向量中

absorbList.push_back(new AbsorbMesh(nurbsMesh));
meshList.push_back(nurbsMesh);
不要忘记删除
absorbList
中的对象,如下所示

for(vector<AbsorbMesh*>::iterator it = absorbList.begin(); it != absorbList.end(); it++) {
    delete it;
  }
(向量)的

如果希望对一个向量中的项进行更新以修改另一个向量中的对象,则需要在两个向量中存储指针

使用您的原始需求(更新一个向量中的项会影响另一个向量中的项,下面是我如何使用boost共享指针来实现这一点。(警告,未测试的代码)

矢量网格列表;
媒介吸收者;
boost::sharedptrnurb=新的吸收体网格(nurbs.CreateMesh(uStride,vStride));
网格列表。推回(nurb);
吸收列表。推回(nurb);
...
...
如果(吸收列表大小()>0)
{
float receivedPower=吸收列表[0]。get()->receivedPower;
}

缺少一些细节,但只是猜测而已

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

现在,指针向量包含一个指向不再存在的对象的指针

尝试向AbsorbMesh类中添加一个副本构造函数,然后像这样添加到向量中

absorbList.push_back(new AbsorbMesh(nurbsMesh));
meshList.push_back(nurbsMesh);
不要忘记删除
absorbList
中的对象,如下所示

for(vector<AbsorbMesh*>::iterator it = absorbList.begin(); it != absorbList.end(); it++) {
    delete it;
  }
(向量)的

如果希望对一个向量中的项进行更新以修改另一个向量中的对象,则需要在两个向量中存储指针

使用您的原始需求(更新一个向量中的项会影响另一个向量中的项,下面是我如何使用boost共享指针来实现这一点。(警告,未测试的代码)

矢量网格列表;
媒介吸收者;
boost::sharedptrnurb=新的吸收体网格(nurbs.CreateMesh(uStride,vStride));
网格列表。推回(nurb);
吸收列表。推回(nurb);
...
...
如果(吸收列表大小()>0)
{
float receivedPower=吸收列表[0]。get()->receivedPower;
}
吸收列表。向后推(&nurbsMesh);
错误

absorbList
保存指向本地对象的指针。当
nurbMesh
被销毁时,您无法写入
absorbList[0]->

absorbList.push_-back(&nurbsMesh);
错误

absorbList
保存指向本地对象的指针。当
nurbMesh
被销毁时,您无法写入
吸收列表[0]->

当您尝试从向量获取指针时,对象被删除

试着做

vector.push_back(new Object);

当您尝试从向量获取指针时,对象被删除

试着做

vector.push_back(new Object);

一旦您解决了其他人提到的问题(存储指向堆栈上对象的指针),您将遇到另一个问题。
向量可能会重新分配,从而导致其内容移动到另一个位置


这样做的安全方法是在两个向量中存储指针。当然,你需要确保它们被删除…但是这是C++给你。

< P>一旦你修复了其他人提到的问题(存储指向堆栈上的对象的指针),您将遇到另一个问题。
向量可能会重新分配,从而导致其内容移动到另一个位置

这样做的安全方法是在两个向量中存储指针。当然,你需要确保它们被删除…但是这是C++给你的。 但是,当我稍后访问指针时,数据似乎已损坏

在向量上放置某个内容时,该向量可能会将其从一个物理位置移动到另一个物理位置(尤其是在调整向量大小时),这会使指向该位置的任何指针无效
absorbList.push_back(&nurbsMesh);
meshList.push_back(nurbsMesh)