c++ - 顺序存储不同类型的对象

标签 c++ midi

我正在尝试使用 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/

相关文章:

c++ - 为什么不支持容器适配器中元素的初始化和迭代

delphi - Delphi ASIO VST 和 MiniHost 的 Midi 计时问题

ios - 如何在 iOS 中发送和接收网络 MIDI 数据?

java - 实现一个基于Android/java的应用程序,该应用程序需要一个音频文件并生成该音频文件的Guitar选项卡?

cocoa - 核心 MIDI : when I send a MIDIPacketList using MIDISend() only the first packet is being sent

C++ unordered_map 其中键也是 unordered_map

java - Java中的线程与C++中的线程有什么不同?

c++ - 在后台缓冲区上设置单个像素

c++ - 在 Code Composer Studio 中取消引用指针

带有 slider 和 MIDI 的 Swift ScrollView