Russian Qt Forum

Qt => Вопросы новичков => Тема начата: gmltA от Июнь 24, 2012, 10:37



Название: QDataStream: No device
Отправлено: gmltA от Июнь 24, 2012, 10:37
Добрый день

Есть класс QPacket. У него 2 публичных члена QByteArray dev, QDataStream out. Конструктор имеет вид
Код:
QPacket::QPacket(clientOpcode opcode)
{
    QByteArray dev;
    QDataStream out(&dev, QIODevice::WriteOnly);
    out << (quint16) 0;
    out << (quint8) opcode;
}
Не подскажите почему следующий код вызывает ошибки QDataStream: No device (4 штуки).
Код:
QPacket packet(C_AUTH_START);
packet.out << "foo";
packet.out << "bar";


Название: Re: QDataStream: No device
Отправлено: mutineer от Июнь 24, 2012, 10:42
Локальные переменные конструктора вижу, публичных членов класса не наблюдается. Вероятно ошибки потому, что packet.out ничем не инициализирован


Название: Re: QDataStream: No device
Отправлено: gmltA от Июнь 24, 2012, 11:33
QDataStream out(&dev, QIODevice::WriteOnly);
Разве не инициализация?


Название: Re: QDataStream: No device
Отправлено: mutineer от Июнь 24, 2012, 11:34
QDataStream out(&dev, QIODevice::WriteOnly);
Разве не инициализация?

Это создание и инициализация локальной для конструктора переменной out


Название: Re: QDataStream: No device
Отправлено: gmltA от Июнь 24, 2012, 11:43
QDataStream out(&dev, QIODevice::WriteOnly);
Разве не инициализация?

Это создание и инициализация локальной для конструктора переменной out
Я так понимаю, QDataStream нельзя просто так присваивать? Не подскажете как заменить
Код:
void setStream(QDataStream stream) { out = stream; }
на корректный вариант?


Название: Re: QDataStream: No device
Отправлено: mutineer от Июнь 24, 2012, 11:45
Можно использовать список инициализации конструктора, можно использовать
void QDataStream::setDevice ( QIODevice * d )
для установки девайса


Название: Re: QDataStream: No device
Отправлено: gmltA от Июнь 24, 2012, 11:52
Можно использовать список инициализации конструктора, можно использовать
void QDataStream::setDevice ( QIODevice * d )
для установки девайса

Код:
void initStream(QDataStream stream) { out.setDevice(stream.device()); }
Так будет верно?


Название: Re: QDataStream: No device
Отправлено: mutineer от Июнь 24, 2012, 11:56
Код:
void initStream(QDataStream stream) { out.setDevice(stream.device()); }
Так будет верно?

смотря что ты собираешься с этим делать. Но два ДатаСтрима на одни девайс это не есть хорошо


Название: Re: QDataStream: No device
Отправлено: gmltA от Июнь 24, 2012, 11:58
смотря что ты собираешься с этим делать. Но два ДатаСтрима на одни девайс это не есть хорошо
Тогда я вообще не понимаю.
Можете объяснить как сделать корректную инициализацию публичного QDataStream в конструкторе с публичным же QByteArray?


Название: Re: QDataStream: No device
Отправлено: mutineer от Июнь 24, 2012, 12:02
смотря что ты собираешься с этим делать. Но два ДатаСтрима на одни девайс это не есть хорошо
Тогда я вообще не понимаю.
Можете объяснить как сделать корректную инициализацию публичного QDataStream в конструкторе с публичным же QByteArray?

Используй список инициализации, Люк. или сделай в конструкторе out.setDevice(&dev) (если out и dev это члены класса)


Название: Re: QDataStream: No device
Отправлено: gmltA от Июнь 24, 2012, 12:17
список инициализации
Самое оно.
Огромное спасибо.