Russian Qt Forum

Qt => Общие вопросы => Тема начата: levcom от Июль 23, 2012, 12:43



Название: QDataStream. Как лучше сделать.
Отправлено: levcom от Июль 23, 2012, 12:43
Разрабатываю реализацию протокола на Qt. Для более простого использования библиотеки применяю по возможности "родные" Qt-типы (qint16, qint32, QDataStream). Однако строчные значения (string) по спецификации протокола сериализуются в бинарный вид отлично от того как это реализовано в QtCore (QString). То при чтении из потока хочется получить QString и использовать стандартные операторы >> <<. Как выйти с наименьшими жертвами - т.е. читать из QDataStream.


Название: Re: QDataStream. Как лучше сделать.
Отправлено: Akon от Июль 23, 2012, 13:48
Сделать класс QStringHolder для нужной вам сериализации строки в QDataStream.


Название: Re: QDataStream. Как лучше сделать.
Отправлено: levcom от Июль 23, 2012, 15:24
Сделать класс QStringHolder для нужной вам сериализации строки в QDataStream.

Приведите хотя бы элементарный пример.
Я так понимаю, Вы предлагаете наследовать QStringHolder : public QString
и перегрузить соответствующие operator >> << в QDataStream?


Название: Re: QDataStream. Как лучше сделать.
Отправлено: Akon от Июль 23, 2012, 15:39
Нет, я категорически против наследования в данном случае. QStringHolder просто держит QString, как, например, смарт-поинтер держит указатель. Просто для QStringHolder можно будет сделать перегрузку глобальных операторов <<, >> c нужным форматом.


Название: Re: QDataStream. Как лучше сделать.
Отправлено: levcom от Июль 25, 2012, 16:16
Нет, я категорически против наследования в данном случае. QStringHolder просто держит QString, как, например, смарт-поинтер держит указатель. Просто для QStringHolder можно будет сделать перегрузку глобальных операторов <<, >> c нужным форматом.



Код:
class QStringHolder
{
public:
    QStringHolder() { }

    friend QDataStream& operator<<(QDataStream& stream, const QStringHolder& value);
    friend QDataStream& operator>>(QDataStream& stream, QStringHolder& value);

    QString str;
};

т.е. если мне надо считать в securityPolicyUri.

QStringHolder st;
QString policyUri;

QDataStream stream;
stream >> st;
policyUri = st.str;

как-то не очень удобно.