Я хочу создать гетерогенную коллекцию, которая может загружаться из файла.
У меня есть этот код:
void HeterogeneousCollection::load(std::istream& is) {
is >> size;
for (size_t i = 0; i<size; ++i)
{
int id;
is >> id;
switch (id) {
case 0:
{
Line* line = new Line;
line->load(is);
this->add(line);
}
case 1:
{
Circle* circle = new Circle;
circle->load(is);
this->add(circle);
break;
}
default:
break;
}
}
}
Я не могу придумать какие-либо другие способы решения этой проблемы, но, как выясняется, она вообще не работает.
Единственная ошибка, которую я получаю, - это нарушение прав доступа во время выполнения, когда я хочу получить доступ к данным, которые, как я предполагал, правильно загружены этим фрагментом кода.
Линия и круг происходят от родительского объекта Shape.
Функция сохранения гетерогенной коллекции:
void HeterogeneousCollection::save(std::ostream& os) const {
os << size << std::endl;
for (size_t i = 0; i < size; i++) {
os << (*this)[i].getId() << std::endl;
(*this)[i].save(os);
}
}
Функция сохранения и загрузки формы:
void Shape::save(std::ostream& os) const
{
os << id << std::endl;
color.save(os);
pos.save(os);
}
void Shape::load(std::istream& is)
{
is >> id;
color.load(is);
pos.load(is);
}
Функция сохранения и загрузки строки:
void Line::save(std::ostream& os) const
{
Shape::save(os);
P1.save(os);
P2.save(os);
}
void Line::load(std::istream& is)
{
Shape::load(is);
P1.load(is);
P2.load(is);
}
файл, из которого я пытаюсь прочитать, созданный предыдущим вызовом save () HeteroStore:
2 //size of store
0 //id of a Line
0 //R of color of a Line
0 //G of color of a Line
0 //B of color of a Line
23 //X of position of a Line
12 //Y of position of a Line
23 //X of a point of a Line
12 //Y of a point of a Line
49 //X of another point of a Line
6 //Y of another point of a Line
1 //id of a Circle
0 //R of color of a Circle
0 //G of color of a Circle
0 //B of color of a Circle
10 //X of position of a Circle
10 //Y of position of a Circle
10 //radius of a Circle