1

私はポインター m_room を取ります (クラス ServicePage の Room *m_room、updateRoom と addService 関数はここにあります)

void ServicePage::updateRoom(QString _text)
{
    m_room = m_reservation->findRoom(_text.toInt());
    qDebug()<<m_room;
    qDebug() << m_room->m_idRoom;
}

から

Room *Reservation::findRoom(int _id)
{
    QVector<Room>::iterator iterator;
    for(iterator = mv_addRooms.begin(); iterator != mv_addRooms.end(); iterator++)
        if(iterator->m_idRoom == _id)
        {
            qDebug()<<_id;
            Room _temp = *iterator;
            return &_temp;
        }
    return null;
}

そして、qDebug の後の回答は問題ありませんが、後で別の関数で qDebug の回答を取得すると、次のようになります。

bool ServicePage::addService()
{
    qDebug()<<m_room;
    qDebug()<<m_room ->m_idRoom;
    return true;
}

m_room は先ほどと同じですが、m_room->m_idRoom が違う値(ランダム値)を返すのはなぜですか?

ご提案ありがとうございます。

4

2 に答える 2

6

ではfindRoom()、スタックに割り当てられた変数へのポインタを返しています。

        qDebug()<<_id;
        Room _temp = *iterator;
        return &_temp;

の戻り値が指すメモリはfindRoom()、関数が戻ると無効になります。

逆参照されたイテレータのアドレスを取得するだけで、これを修正できます。

        qDebug()<<_id;
        return &*iterator;

そうすれば、コンテナー内のインスタンスへのポインターが返されます。コンテナがvector<>. のvector<>サイズが大きくなると、以前に返されたすべてのポインター値が無効になります。

于 2013-06-25T21:50:07.673 に答える
0

の代わりに_tempasを宣言します。そうすれば、スタック上の要素のコピーではなく、mv_addRooms 内の要素へのポインターになります。Room &Room&_temp

于 2013-06-25T21:53:56.453 に答える