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