c++ - 将任何对象传递给函数以创建此对象
问题描述
我正在使用 openframeworks 和 c++ 制作一个小型的生成视频分层软件。为此,我有一个主类、一个层类和许多不同类型的视频/模拟类。我需要这样做,以便当我按下一个键时,会加载不同的模拟。
我有两个问题:
- 如何访问所有模拟类的列表?
- 接下来,我如何将这个列表中的一个选项提供给一个可以接受任何类型对象并启动它的函数?
我做了一个绘图而不是使用代码括号将所有 3 个块都放在同一水平面上(实际代码在下面)。
为了清楚起见,这是代码中的 main.cpp 和 layer.cpp :
// main.cpp
void ofApp::setup(){
layer1.setup();
layer2.setup();
layer3.setup();
}
void ofApp::update(){
layer1.update();
layer2.update();
layer3.update();
}
void ofApp::draw(){
layer1.draw();
layer2.draw();
layer3.draw();
}
void ofApp::keyPressed(int key){
switch (key)
{
case '1':
// get first class from list of classes
layer1.changeSim(); // input first class from list of simulation classes
break;
default:
break;
}
}
和 layer.cpp
void layer::setup(){
simulation = new Simulation(); // how do i initialize the Simulation variable if I dont know what type itll be ?
}
void layer::update(){
simulation.update();
}
void layer::draw(){
simulation.draw();
}
void layer::changeSim(){
simulation = new Simulation(); // destroy old simulation and create new one, but will be of a different class
}
解决方案
最好的方法是使用工厂模式。
基本上,定义一个函数,该函数采用某种已定义类型的参数,可用于确定您想要什么样的模拟,然后创建该模拟并返回一个指向它的指针。
它的简单版本可能如下所示:
enum SimulationType
{
Simulation_None,
Simulation_Basic,
Simulation_Complex,
...
};
Simulation* CreateSimulation(SimulationType Type)
{
switch(Type)
{
case Simulation_None:
default:
return nullptr;
case Simulation_Basic:
return new BasicSimulation();
case Simulation_Complex:
return new ComplexSimulation();
...
}
}
...
void ofApp::keyPressed(int key){
switch (key)
{
case '1':
// get first class from list of classes
layer1.changeSim(Simulation_Basic); // input first class from list of simulation classes
break;
default:
break;
}
}
...
void layer::setup(){
simulation = CreateSimulation(Simulation_None);
}
void layer::changeSim(SimulationType Type){
if(simulation) delete simulation;
simulation = CreateSimulation(Type);
}
这是一个简单的例子——你也可以使用一个由 索引的表SimulationType
,一个有序的映射,SimulationType
它引用每种类型的静态构造函数,基本上是任何将标识符与构造函数相关联的东西。
推荐阅读
- batch-file - 如果语句 != 不起作用
- c# - 将 recaptcha 迁移到 v2 中的隐藏字段
- google-chrome - 在 chrome 上再次强制“添加到主屏幕”提示
- html - 自动播放静音视频背景角度 5
- python - Python JSON解析器错误:json.decoder.JSONDecodeError:期望值:第1行第1列(char 0)
- database - 如何将本地 Oracle 11g DSN 共享给他人?
- tcp - 使用 NFQUEUE 强制重传
- javascript - React Redux Array.Map Fetch - 当所有文件都成功时返回成功
- javascript - 一些 hr 标签内部有间隙,而另一些则没有
- python - 如何将数据中的列转换为日期格式以使其工作熊猫