Прямо сейчас, как вы это делаете, теперь трудно понять, чего ожидать, когда вы читаете поток контента такого объекта. т.е. если вы читаете float, int или строку?
Предполагая, что вы можете изменить оператор вывода, есть два подхода, которые Вы можете взять с собой:
Удалить условную логику в целом:
лучший способ приблизиться к этому, на мой взгляд было бы переписать выход оператор, как:
ostream& operator<<(ostream& os, const myObject& obj)
{
os << '(' << obj.somefloat << ')'
<< '(' << obj.oneint
<< '#' << obj.twoint << ')';
return os;
}
Затем вы можете написать оператор ввода, как:
istream& operator>>(istream& is, myObject& obj)
{
char discard = 0;
is >> discard;
is >> obj.somefloat;
is >> discard >> discard;
is >> obj.oneint >> discard;
is >> obj.twoint >> discard;
return is;
}
(Конечно, вы также должны добавить обработку ошибок между чтениями)
Сериализация условной логики:
Вы можете сохранить «формат» вашего объекта в качестве явного параметра. Это в основном то, что сделано в большинстве схем сериализации документов, поддерживающих управление версиями.
enum SerializationMode {
EMPTY = 0,
FLOAT,
INT_PAIR
};
оператор Выход становится:
ostream& operator<<(ostream& os, const myObject& obj)
{
SerializationMode mode = EMPTY;
if (obj.somefloat != 0)
mode = FLOAT;
else if (obj.oneint != 0 && obj.twoint != 0)
mode = INT_PAIR;
os << mode << '#';
if (FLOAT == mode)
os << "(" << obj.somefloat << ")";
else if (INT_PAIR == mode)
os << "(" << obj.oneint << "#" << obj.twoint << ")";
return os;
}
Входной оператор:
istream& operator>>(istream& is, myObject& obj)
{
char discard = 0;
unsigned uMode = 0;
is >> uMode >> discard;
auto mode = static_cast<SerializationMode>(uMode);
switch(mode) {
default: break;
case FLOAT: {
is >> discard >> obj.somefloat >> discard;
break;
}
case INT_PAIR: {
is >> discard >> obj.oneint >> discard;
is >> obj.twoint >> discard;
break;
}
}
return is;
}
'если (не действительный объект myObj не найдено в потоке *) '' is.setstate (std :: ios :: failbit); 'Как реализовать это и что это значит? – eldos
Я не уверен, о чем вы говорите. Проблема с этим генеалогическим подходом заключается в том, что в зависимости от типа потока два разных объекта (например, int и float) могут иметь одинаковые представления. Например, с бинарным потоком '0x40000000' может означать значение float 2.0f или значение без знака 1073741824 –