#c #qt #stream #operator-overloading #friend-function
#c #qt #поток #оператор-перегрузка #друг-функция
Вопрос:
У меня есть класс с именем, Packet
который я хочу сериализовать с помощью QDataStream
, который я перегрузил operator>>
и operator<<
и в перегруженной функции, которую я вызвал, stream << somIntMember
хотя она объявлена как friend, она жалуется на закрытые переменные
error: 'int DG::Packet::_state' is private
error: 'DG::Packet::PacketType DG::Packet::_type' is private
Вот мой заголовок.
namespace DG{
class Packet{
public:
struct CommonHeader{
public:
quint32 id;
QTime time;
quint32 size;
PacketType packetType;
public:
CommonHeader();
CommonHeader(quint32 sz, PacketType type);
friend QDataStreamamp; operator<<(QDataStreamamp;, const Packet::CommonHeaderamp; header);
friend QDataStreamamp; operator>>(QDataStreamamp;, Packet::CommonHeaderamp; header);
};
private:
PacketType _type;
int _state;
public:
friend QDataStreamamp; operator<<(QDataStreamamp;, const Packetamp; packet);
friend QDataStreamamp; operator>>(QDataStreamamp;, Packetamp; packet);
};
}
И здесь начинается Code
#include "packet.h"
using namespace DG;
QDataStreamamp; operator<<(QDataStreamamp; stream, const Packetamp; packet){
stream << packet._state << packet._type;
return packet.serialize(stream);
}
Комментарии:
1. Почему вторые параметры для operator>>() являются const?
2. О! Я, я, спасибо ТЕБЕ… Я просто копирую paster operator<< и меняю его на operator>>
Ответ №1:
Ну, причина no match for 'operator>>'
ошибки в том, что для operator>>
нет никакого соответствия, по крайней мере, не в коде, который вы показали. Единственные operator>>
и operator<<
в показанном вами коде — это для Packet::CommonHeader
и для Packet
. Ничего для a quint32
, ни для a QTime
, ни для a PacketType
, ни для an int
.
Если уж на то пошло, реализации, которые вы нам показали, предназначены для Packet::CommonHeader
и Packet
; классы, однако, находятся в пространстве имен DG
, а не в глобальном пространстве имен.
Это также может объяснить причину, по которой friend
не работает. Операторы, которые вы объявили как friend, находятся в пространстве имен DG
, те, которые вы определяете, находятся в глобальном пространстве имен (и, таким образом, являются совершенно не связанными функциями).
Комментарии:
1. Выполнение
DG::operator<<
в cpp решило проблему с другом. Но этоDG::operator<<
не глобальноеoperator<<
, так что сработает ли это при перегрузке оператора?2. Компилятор найдет это в любое время, когда какой-либо из аргументов каким-либо образом подразумевает
DG
; например, еслиQDataStream
находится вDG
, всегда. В противном случае вы можете создать::operator>>
и т.д.friend
, или вы можете предоставить общедоступную функцию-членoperator<<
, таким образом избегая необходимостиfriend
.3. Но
QDataStream
не вDG
4. В этом случае вам, вероятно, не нужны
operator<<
и др. вDG
либо, и следует создать::operator<<
и::operator>>
friend (или предоставить общедоступныеscan
функции, которые они вызывают).
Ответ №2:
Сначала удалите const из параметров rhs в >> operators при их изменении.