gpt4 book ai didi

c++ - 转换一个由迭代器指向的对象

转载 作者:行者123 更新时间:2023-11-30 01:44:07 25 4
gpt4 key购买 nike

我有这个 multiset 容器:

multiset<IMidiMsgExt, IMidiMsgExtComp> queuedNotes;

IMidiMsgExt是我自己创建的一个结构(我需要它来获得一个附加属性 mTick ),它扩展了 IMidiMsg :

struct IMidiMsgExt : public IMidiMsg
{
IMidiMsgExt() {
}

double mTick = 0.;

void IMidiMsgExt::MakeNoteOnMsg(int noteNumber, int velocity, int offset, double tick, int channel)
{
Clear();
mStatus = channel | (kNoteOn << 4);
mData1 = noteNumber;
mData2 = velocity;
mOffset = offset;
mTick = tick;
}

void IMidiMsgExt::MakeNoteOffMsg(int noteNumber, int offset, double tick, int channel)
{
Clear();
mStatus = channel | (kNoteOff << 4);
mData1 = noteNumber;
mOffset = offset;
mTick = tick;
}

void IMidiMsgExt::Clear()
{
mOffset = 0;
mStatus = mData1 = mData2 = 0;
mTick = 0.;
}
};

下一步:我存储在queuedNotes多集一些 IMidiMsgExt对象,具有:

IMidiMsgExt* noteOff = new IMidiMsgExt;
noteOff->MakeNoteOffMsg(57, 0, tickSize * 111, 0);
queuedNotes.insert(*noteOff);

现在,我需要使用一个名为 SendMidiMsg(IMidiMsg* pMsg) 的函数(以 IMidiMsg 类型作为输入)发送我的对象 IMidiMsgExt

我将列表中的第一个对象提取到迭代器中:

auto midiMessage = queuedNotes.begin();

但是当我尝试转换它并使用 SendMidiMsg 时:

SendMidiMsg((IMidiMsgExt*)midiMessage);

它说no suitable conversion function from "std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<IMidiMsgExt>>>" to "IMidiMsg *" exists

我哪里错了?我应该使用 dynamic casting 吗? ?

最佳答案

auto midiMessage = queuedNotes.begin();

midiMessagestd::multiset::iterator 类型。而且它不能转换为您的类型 IMidiMsgExt。迭代器是一个行为类似于指针的对象,因此您可以使用取消引用运算符 (*) 来获取它“指向”的对象。您也不需要将派生对象转换为其基础,这是隐式完成的。您需要做的就是获取迭代器“指向”的地址,以获取指向 IMidiMsgExt 的指针:

SendMidiMsg(&*midiMessage);

&*midiMessage 的快速分解:

  variable    -     type
midiMessage - std::multiset::iterator
*midiMessage - IMidiMsgExt
&*midiMessage - IMidiMsgExt*

编辑:关于你的 const_iterator 错误。 std::multiset::begin() is supposed to always return const_iterator .您的函数 SendMidiMsg() 需要一个非 const 指针 - 它表示它想要编辑消息。 multiset 不允许更改元素。

您可以复制消息,然后调用SendMidiMsg()。如果您不再需要容器内的消息,您也可以事后将其删除。

auto msg = *midiMessage;
SendMidiMsg(&msg);
queuedNotes.erase(midiMessage);

注意:您的程序似乎存在内存泄漏。您使用 new 创建消息,但我没有看到任何删除和释放内存的调用。

IMidiMsgExt* noteOff = new IMidiMsgExt;
noteOff->MakeNoteOffMsg(57, 0, tickSize * 111, 0);
queuedNotes.insert(*noteOff);

关于c++ - 转换一个由迭代器指向的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36765859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com