如何制作产生相同类别对象的类别

时间:2018-07-26 10:49:24

标签: c++ oop polymorphism

我正在尝试制作一个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
}

3 个答案:

答案 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向量中的所有粒子(删除了被破坏的粒子)。