首页 > 解决方案 > 将任何对象传递给函数以创建此对象

问题描述

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

我有两个问题:

  1. 如何访问所有模拟类的列表?
  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
}

标签: c++oopopenframeworks

解决方案


最好的方法是使用工厂模式。

基本上,定义一个函数,该函数采用某种已定义类型的参数,可用于确定您想要什么样的模拟,然后创建该模拟并返回一个指向它的指针。

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

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它引用每种类型的静态构造函数,基本上是任何将标识符与构造函数相关联的东西。


推荐阅读