Я создаю систему частиц, и я борюсь с тем, как структурировать свой код. Идея состоит в том, что пользователь может создать один или несколько объектов ParticleEmitter
, которые передаются объекту ParticleManager
через объект ofxCurlNoise
.
Теперь я хочу, чтобы когда пользователь обновляет объекты ParticleEmitters
, объект ParticleManager
видел внесенные изменения. Поэтому я использовал общие указатели, но у меня возникают ошибки сегментации в разное время, независимо от того, использую ли я один ParticleEmitter
(ошибка сегментации при запуске программы) или vector<ParticleEmitter>
(ошибка сегментации при выходе из программы).
Что с этим не так? Есть ли шаблон проектирования для того, что я пытаюсь сделать?
ofApp.h
#include "ofxCurlNoise.h"
class ofApp : public ofBaseApp{
// ParticleEmitter particleEmitter;
vector<ParticleEmitter> particleEmitters;
ofxCurlNoise curlNoise;
public:
void setup();
};
ofApp.cpp
#include "ofApp.h"
void ofApp::setup(){
// This produces a segfault as soon as the program starts
// particleEmitter.setup();
// curlNoise.setup(particleEmitter, 1024*256);
// This produces a segfault when the program exits
ParticleEmitter emitter;
emitter.setup();
particleEmitters.push_back(emitter);
curlNoise.setup(particleEmitters, 1024*256);
}
ofxCurlNoise.h
#include "ParticleManager.h"
class ofxCurlNoise {
ParticleManager particleManager;
public:
void setup(ParticleEmitter& emitter, int n);
void setup(vector<ParticleEmitter>& emitters, int n);
private:
void setup(int n);
};
ofxCurlNoise.cpp
#include "ofxCurlNoise.h"
void ofxCurlNoise::setup(ParticleEmitter& emitter, int n){
particleManager.addEmitter(shared_ptr<ParticleEmitter>(&emitter));
setup(n);
}
void ofxCurlNoise::setup(vector<ParticleEmitter>& emitters, int n){
for(auto& e : emitters){
particleManager.addEmitter(shared_ptr<ParticleEmitter>(&e));
}
setup(n);
}
void ofxCurlNoise::setup(int n){
particleManager.setup(n);
}
ParticleManager.h
#include "ParticleEmitter.h"
class ParticleManager{
vector<shared_ptr<ParticleEmitter>> emitters;
public:
void addEmitter(const shared_ptr<ParticleEmitter>& emitter);
void setup(int n);
};
ParticleManager.cpp
#include "ParticleManager.h"
void ParticleManager::setup(int n){
//...
}
void ParticleManager::addEmitter(const shared_ptr<ParticleEmitter>& emitter){
emitters.push_back(emitter);
}
shared_ptr
s на элементы вvector
, а не на локальные переменные. 23.02.2015ParticleEmitters
объекты в классеofApp
. Однако изменения, внесенные вParticleEmitter
вofApp
, должны быть видны вParticleManager
. Как я могу этого добиться? 23.02.2015ofApp
владеетParticleEmitter
s 23.02.2015ofApp
, и я хочу, чтобы он был максимально простым (то есть не использовал указатели в ofApp). Итак, есть ли способ сделать это и сохранить код вofApp
как есть? 23.02.2015