Avlordin
@Avlordin

Почему не получается добавить объект в вектор?

Нужно добавить объекты разных классов, которые являются наследниками класса 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
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
@galaxy
У вас странная функция find():
base* base::find(string name) {
	base* object = nullptr;
	for (base* element : this->components) {
		if (element->get_name() == name)
			object = element;
		if (object == nullptr) {
			object = element->find(name);
		}
		return object;
	}
}


Она не ищет дальше первого элемента components. obj3 она соответственно и не находит, программа валится на касте nullptr к object2
if (classNumber == 2)
        inner_component = dynamic_cast <object2*>(primary.find(head_name));

(не понимаю, зачем столько кастов)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы