Russian Qt Forum
Ноябрь 25, 2024, 05:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDataStream: No device  (Прочитано 5167 раз)
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";
Записан
mutineer
Гость
« Ответ #1 : Июнь 24, 2012, 10:42 »

Локальные переменные конструктора вижу, публичных членов класса не наблюдается. Вероятно ошибки потому, что packet.out ничем не инициализирован
Записан
gmltA
Гость
« Ответ #2 : Июнь 24, 2012, 11:33 »

QDataStream out(&dev, QIODevice::WriteOnly);
Разве не инициализация?
Записан
mutineer
Гость
« Ответ #3 : Июнь 24, 2012, 11:34 »

QDataStream out(&dev, QIODevice::WriteOnly);
Разве не инициализация?

Это создание и инициализация локальной для конструктора переменной out
Записан
gmltA
Гость
« Ответ #4 : Июнь 24, 2012, 11:43 »

QDataStream out(&dev, QIODevice::WriteOnly);
Разве не инициализация?

Это создание и инициализация локальной для конструктора переменной out
Я так понимаю, QDataStream нельзя просто так присваивать? Не подскажете как заменить
Код:
void setStream(QDataStream stream) { out = stream; }
на корректный вариант?
Записан
mutineer
Гость
« Ответ #5 : Июнь 24, 2012, 11:45 »

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

Можно использовать список инициализации конструктора, можно использовать
void QDataStream::setDevice ( QIODevice * d )
для установки девайса

Код:
void initStream(QDataStream stream) { out.setDevice(stream.device()); }
Так будет верно?
Записан
mutineer
Гость
« Ответ #7 : Июнь 24, 2012, 11:56 »

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

смотря что ты собираешься с этим делать. Но два ДатаСтрима на одни девайс это не есть хорошо
Записан
gmltA
Гость
« Ответ #8 : Июнь 24, 2012, 11:58 »

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

смотря что ты собираешься с этим делать. Но два ДатаСтрима на одни девайс это не есть хорошо
Тогда я вообще не понимаю.
Можете объяснить как сделать корректную инициализацию публичного QDataStream в конструкторе с публичным же QByteArray?

Используй список инициализации, Люк. или сделай в конструкторе out.setDevice(&dev) (если out и dev это члены класса)
Записан
gmltA
Гость
« Ответ #10 : Июнь 24, 2012, 12:17 »

список инициализации
Самое оно.
Огромное спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 20.