【发布时间】:2015-02-23 09:48:11
【问题描述】:
我正在制作一个粒子系统,但我正在为如何构建我的代码而苦苦挣扎。这个想法是用户可以创建一个或多个ParticleEmitter 对象,这些对象通过ofxCurlNoise 对象传递给ParticleManager 对象。
现在,我希望当用户更新 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);
};
粒子管理器.cpp
#include "ParticleManager.h"
void ParticleManager::setup(int n){
//...
}
void ParticleManager::addEmitter(const shared_ptr<ParticleEmitter>& emitter){
emitters.push_back(emitter);
}
【问题讨论】:
-
引用 SO 指南:“寻求调试帮助的问题必须包括所需的行为、特定问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题是没有用的给其他读者。”
-
@UlrichEckhardt 这个确实实际上包含识别错误所需的代码和相当清晰的问题陈述。这不是一个很好的问题,但我见过更糟糕的情况。
-
在
std::shared_ptr中,您只能保留动态创建的对象(由new)...据我所知-您将传递给std::shared_ptrvector<ParticleEmitter>中的任何内容... -
它没有
main(),它有一堆不同的类和函数,所以既有缺失又有多余的部分。这与引用的规则 @Angew 形成对比。 -
是的,如果我不够清楚,对不起。这是openFrameworks的代码,程序启动时会调用
ofApp::setup()。
标签: c++ c++11 design-patterns overloading shared-ptr