C ++, как загрузить гетерогенную коллекцию из файла - PullRequest
0 голосов
/ 13 мая 2018

Я хочу создать гетерогенную коллекцию, которая может загружаться из файла.

У меня есть этот код:

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

1 Ответ

0 голосов
/ 13 мая 2018

Я понял, что функция add () увеличивает размер каждый раз, когда указатель добавляется в гетерогенную коллекцию, поэтому размер (инициализированный ненулевым значением в начале функции загрузки) не будет правильно отображать размер хранилища.и каждая функция магазина, которая полагается на него, будет сломана до чертиков.Например, в функции save () цикл for будет выполняться слишком много, и к несуществующим указателям будет необходим доступ, поскольку ошибка показала правильно.

Решение:

void HeterogeneousCollection::load(std::istream& is) {

    is >> sizeofotherstore;

    for (size_t i = 0; i<sizeofotherstore; ++i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...