Я создаю систему частиц, и я борюсь с тем, как структурировать свой код. Идея состоит в том, что пользователь может создать один или несколько объектов ParticleEmitter
, которые передаются объекту ParticleManager
через объект ofxCurlNoise
.Ошибка сегментации при использовании shared_ptr
Теперь, когда пользователь обновляет объекты 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);
}
Цитирование SO рекомендация: «Вопросы ищет отладочная помощь должна включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого заявления о проблемах не полезны другим читателям ». –
@UlrichEckhardt Этот * * действительно содержит как код, необходимый для идентификации ошибки, так и достаточно четкую постановку задачи. Это не звездный вопрос, но я видел хуже. – Angew
В 'std :: shared_ptr' вы можете хранить только динамически созданные объекты (по' new') ... Из того, что я вижу - вы переходите к 'std :: shared_ptr', что находится в' vector '.. –
PiotrNycz