[英]Cast an object that is pointed by an iterator
我有這個多集容器:
multiset<IMidiMsgExt, IMidiMsgExtComp> queuedNotes;
IMidiMsgExt
是我創建的結構(擴展IMidiMsg ,我需要一個附加屬性mTick
):
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.;
}
};
下一步:我將一些IMidiMsgExt
對象存儲在該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();
midiMessage
類型為std::multiset::iterator
。 而且它不能轉換為您的IMidiMsgExt
類型。 迭代器是一個行為類似於指針的對象,因此您可以使用取消引用運算符( *
)獲取其“指向”的對象。 您也不需要將派生對象強制轉換為其基礎,這是隱式完成的。 您需要做的就是獲取迭代器“指向”的地址,以獲取指向IMidiMsgExt
的指針:
SendMidiMsg(&*midiMessage);
&*midiMessage
快速分解:
variable - type
midiMessage - std::multiset::iterator
*midiMessage - IMidiMsgExt
&*midiMessage - IMidiMsgExt*
編輯:關於您的const_iterator錯誤。 std :: multiset :: begin()應該總是返回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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.