Нужно добавить объекты разных классов, которые являются наследниками класса base, в дерево иерархии.
Пример выполнения программы
Ввод:
root (Корневой объект)
root obj1 3 5 (Головной объект, подчиненный объект, номер класса объекта, состояние объекта)
root obj2 4 -5
root obj3 2 1
obj3 obj4 2 5
Вывод:
Test result
The object root is ready.
The object obj1 is ready.
The object obj2 is not ready.
The object obj3 is ready.
The object obj4 is ready.
Ошибка заключается в следующем: строка
obj3 obj4 2 5 не выполняется, выдается ошибка:
Вызвано исключение по адресу 0x65DA8871 (vcruntime140d.dll) в Lab1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCB000024.
Причем добавлять к корневому объекту удается без ошибок. Программы не выполняется только когда пытаюсь добавить объект, который подчиняется отличному от root объекту.
Привожу код функции построения дерева иерархии:
void rootObject::build()
{
cin >> head_name;
base primary(head_name, 1);
base* inner_component = nullptr;
cin >> head_name >> component_name >> classNumber >> status;
while (true) {
if (head_name == primary.get_name()) {
if (classNumber == 2)
primary.add(new object2(component_name, status, &primary));
if (classNumber == 3)
primary.add(new object3(component_name, status, &primary));
if (classNumber == 4)
primary.add(new object4(component_name, status, &primary));
}
else {
if (classNumber == 2)
inner_component = dynamic_cast <object2*>(primary.find(head_name));
if (classNumber == 3)
inner_component = dynamic_cast <object3*>(primary.find(head_name));
if (classNumber == 4)
inner_component = dynamic_cast <object4*>(primary.find(head_name));
if (inner_component != nullptr) {
if (classNumber == 2)
(*inner_component).add(new object2(component_name, status, &primary));
if (classNumber == 3)
(*inner_component).add(new object3(component_name, status, &primary));
if (classNumber == 4)
(*inner_component).add(new object4(component_name, status, &primary));
}
}
cin >> head_name;
if (head_name == "endtree")
break;
cin >> component_name >> classNumber >> status;
}
cout << "Test result";
primary.print_status();
}
void base::add(base* component) {
components.push_back(component);
}
Сам вектор:
vector <base*> components;
Ссылка на весь проект, если поможет с решением проблемы:
https://dropmefiles.com/uJkqo