我正在尝试制作一个particle
类,该类能够生成其他粒子,但是却使自己陷入困境!
到目前为止,我创建了一个spawner
类,其中包含一个粒子向量。我认为particle
类将需要能够“看到”生成器,以便向此向量添加新粒子,因此在particle
内,我创建了一个指向该生成器的指针。然后,我的希望是,particle::spawn()
函数将创建一个新粒子并将其添加到矢量中,但是却带来了错误(“线程1:EXC_BAD_ACCESS(code = EXC_I386_GPFLT)”)。
为什么此代码不起作用?有什么更简单的方法可以实现我所缺少的吗?
注意-我实际上是使用 pointers 的向量来spawner
内的粒子,因为我最终想要创建一个具有它自己的子类(例如particle_sub1
)可以通过多态性访问的spawn()
和test()
函数。
谢谢!
#include <iostream>
#include <random>
using namespace std;
// forward declare particle class
class particle;
// --------------------------------
// spawner class
class spawner {
public:
// vector of pointers to particles
vector<particle*> particle_ptr_vec;
spawner() {};
};
// --------------------------------
// particle class
class particle {
public:
// pointer back to spawner object
static spawner* spawner_ptr;
particle() {};
void set_ptr(spawner &x) {spawner_ptr = &x;}
virtual void spawn();
virtual void test() {cout << "pass test\n";}
};
// initialise static variable
spawner* particle::spawner_ptr;
// spawn new particle
void particle::spawn() {
particle x;
spawner_ptr->particle_ptr_vec.push_back(&x);
cout << "spawn particle\n";
}
// --------------------------------
// main funciton
int main(int argc, const char * argv[]) {
// create spawner
spawner s;
// create first particle and define pointer back to spawner
particle z;
s.particle_ptr_vec.push_back(&z);
s.particle_ptr_vec[0]->set_ptr(s);
// spawn new particle
s.particle_ptr_vec[0]->spawn();
// check that two particles exist
cout << "number of particles: " << s.particle_ptr_vec.size() << "\n";
// test that worked
s.particle_ptr_vec[0]->test(); // this test passes
s.particle_ptr_vec[1]->test(); // this test throws the error
}
答案 0 :(得分:0)
问题出在这里
"error": {
"errors": [
{
"domain": "global",
"reason": "forbidden",
"message": "Insufficient permissions for this file",
"locationType": "other",
"location": "file.permissions"
}
],
"code": 403,
"message": "Insufficient permissions for this file"
}
}
您正在将向量的指针保存到退出该方法时被破坏的对象。
一个答案是对象的动态分配,即创建具有不确定寿命的对象,以便您可以控制它们的销毁时间。
答案 1 :(得分:0)
按值存储粒子以解决您的问题:vector<particle> particle_ptr_vec;
。然后spawner_ptr->particle_ptr_vec.push_back({});
。
答案 2 :(得分:0)
您正在尝试解决面向对象的问题,该问题更适合于功能样式。这给您带来麻烦,因为您的对象现在正在管理其他粒子的数据,而不仅仅是它们自己的数据。这与OOP中使用的封装原理直接相反。
我建议做这样的事情:
auto particles = std::vector<particle>{};
//initialize some values into particles...
//define a new particle list or the for each syntax does not work
auto new_particles = std::vector<particle>{};
for (auto&& current : particles)
if (current.needs_to_spawn_new_particles())
for (auto&& new_particle : current.new_particles())
new_particles.emplace_back(new_particle);
//update particles with new_particles
这甚至为您留出扩展功能的空间:
for (auto&& current : particles) {
current.update();
if (current.needs_to_spawn_new_particles())
for (auto&& new_particle : current.new_particles())
new_particles.emplace_back(new_particle);
else if (!current.needs_to_be_destroyed())
new_particles.emplace_back(current);
}
现在,这将为您提供new_particles
向量中的所有粒子(删除了被破坏的粒子)。