簡體   English   中英

投射由迭代器指向的對象

[英]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對象存儲在該queuedNotesIMidiMsgExt ,其內容如下:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM