我正在尝试使用 MIDI 文件,它们只是各种类型音乐事件的序列,例如“音符开启”、“音符关闭”、“速度变化”等。总共可能有 30 种不同类型的这些事件,每个事件都有不同的数量、大小和类型的字段。其中一些甚至将任意长度的整个字符串作为字段。所有事件共有的一个字段是时间字段,它指定当前事件应该在前一个事件发生后多长时间发生。
我在弄清楚如何在程序中存储和使用 MIDI 文件时遇到了一些困难。鉴于时间字段的工作方式,按顺序存储所有这些事件非常重要,但我不知道可以包含多种类型对象的容器。我可以只制作一个包含所有事件类型的所有字段的大型对象,并且只使用每个特定事件所需的字段,但这似乎效率很低。我还可以制作 30 个不同的 vector ,并让一个主 vector 跟踪所有内容的顺序,但这听起来很可怕。解决此问题的最佳方法是什么?
最佳答案
如果你像这样使用 MusicalEvent 接口(interface)会怎么样:
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
}
}
然后您的 vector 可以按以下方式使用:
std::vector<MusicalInterface*> myVector;
myVector.push_back(new Instance1());
myVector.push_back(new Instance2());
最后记得释放内存。
关于c++ - 顺序存储不同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18582639/