按顺序存储不同类型的对象

时间:2013-09-03 01:03:37

标签: c++ midi

我正在尝试使用midi文件,这些文件只是各种音乐事件的序列,例如'note on','note off','tempo change'等等。总之,有大约30种不同类型的这些事件,每个都有不同的数量,大小和类型的字段。他们中的一些人甚至拥有任何长度的整个字符串作为字段。所有事件共同的一个字段是时间字段,指定在前一事件之后多长时间应该发生当前事件。

我在查找如何在程序中存储和使用midi文件时遇到了一些困难。鉴于时间字段的工作原理,顺序存储所有这些事件非常重要,但我不知道可以包含多种类型对象的容器。我只能创建一个包含所有事件类型中所有字段的超级对象,并且只使用每个特定事件所必需的字段,但这似乎效率很低。我还可以制作30个不同的向量,并且有一个主矢量跟踪所有内容的顺序,但这听起来相当噩梦。什么是最好的方法呢?

2 个答案:

答案 0 :(得分:0)

如果您使用MusicalEvent接口,如下所示:

class MusicalInterface
{
    virtual void play(); //I'm guessing here, put the common behavior
    //the timeField, common to all classes
}

class Instance1 : public MusicalIterface
{
    void play()
    {
        //specific implementation
    }
}

class Instance2 : public MusicalIterface
{
    void play()
    {
        //specific implementation
    }
}

然后您的矢量可以按以下方式使用:

std::vector<MusicalInterface*> myVector;

myVector.push_back(new Instance1());
myVector.push_back(new Instance2());

请记得最后释放内存。

答案 1 :(得分:0)

查看MIDI.NET如何做到这一点。它不是C ++而是C#,但设计理念足够便携。

希望它有所帮助, Marc(MIDI.NET的作者)