将任何对象传递给函数以创建此对象

pass any object to function to create this object

我正在使用 openframeworks 和 c++ 制作一个小型生成视频分层软件。为此,我有一个主要 class、一层 class 和许多不同类型的 video/simulations class。我需要这样做,以便当我按下一个键时,加载不同的模拟。

我有两个问题:

  1. 如何访问我的所有模拟 classes 的列表?
  2. 接下来,我如何将此列表中的一个选择提供给一个可以接受任何类型的对象并启动它的函数?

我画了一张图,而不是使用代码将所有 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
}

执行此操作的最佳方法是使用称为工厂模式的东西。

基本上,定义一个函数,该函数接受某个已定义类型的参数,可用于确定您想要的模拟类型,然后创建该模拟和 return 指向它的指针。

它的一个简单版本可能如下所示:

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 索引的 table,一个 SimulationType 的有序映射,它引用每种类型的静态构造函数,基本上任何将标识符与构造函数相关联。