У меня была такая же проблема. я должен инициализировать объект из того, что я прочитал в файле xml, и, конечно же, я не могу контролировать, что может произойти с этим файлом.
Конструктор имеет перечисление в качестве аргумента:
enum status_t { NOT_STARTED, STARTED, DONE };
MyObject::MyObject(int id, status_t status) : m_id(id), m_status(status){}
Поэтому при разборе Xml я должен его использовать. Затем я предпочел обрабатывать приведение в конструкторе, чтобы другим классам не нужно было знать, какие перечисления являются допустимыми.
MyObject::MyObject(int id, int status) : m_id(id){
m_status = status_t(status);
}
Но нет способа быть уверенным, что значение, полученное из xml, будет в правильном диапазоне.
Вот решение, с которым я пришел:
MyObject::MyObject(int id, int status) : m_id(id){
switch(status){
case NOT_STARTED:
case STARTED:
case DONE:
m_status=status_t(status);
break;
default:
m_status=NOT_STARTED;
break;
}
}
Это выбор реализации, чтобы установить значение по умолчанию в случае несогласованных данных. Можно было бы предпочесть выбрасывать исключение, в моем случае так и будет.
person
Pellekrino
schedule
11.07.2017