Как сказано в заголовке, у меня возникла проблема при попытке вставить новое значение в карту, которая находится в классе stati c.
Этот класс stati c называется TaskCreator
и его цель - быть фабрикой для задач. Внутри TaskCreator
задачи сначала сохраняются на карте, затем при запуске программы на основе входных аргументов создается и выполняется правильная задача. Довольно прямолинейно. Каждый класс задачи (также stati c) наследует класс TaskCreator
, поэтому класс и карта должны быть созданы по всем правилам до вызова REGISTER_TASK_TO_CREATOR
.
task71. cpp :
REGISTER_TASK_TO_CREATOR(Task71, 7.1)
REGISTER_TASK_TO_EXECUTOR(Task71, 7.1)
std::shared_ptr<TaskCreator> Task71::create()
{
return std::shared_ptr<TaskCreator>(new Task71());
}
taskcreator.h :
#define REGISTER_TASK_TO_CREATOR(className, taskName) \
bool className::_creatorRegistered = \
TaskCreator::registerTask(#taskName, className::create());
[...]
class TaskCreator
{
[...]
static std::map<std::string, std::shared_ptr<TaskCreator>> _taskMap;
[...]
}
taskcreator. cpp:
std::map<std::string, std::shared_ptr<TaskCreator>> TaskCreator::_taskMap;
[...]
bool TaskCreator::registerTask(std::string taskName, std::shared_ptr<TaskCreator> createFunc)
{
auto it = _taskMap.find(taskName);
if (it == _taskMap.end()) {
_taskMap[taskName] = createFunc; // -> point of failure
return true;
}
return false;
}
Раньше это работало, но как только я сгруппировал исходные файлы и заголовки во вложенные папки, дела пошли под откос. Я использую Qt Creator 4.10.2 на Win 10, и я добавил следующие вещи в файл .pro:
SOURCES += \
main.cpp \
[...]
api/taskcreator.cpp \ # -> worked without api/ prefix, same for HEADERS
[...]
tasks/task71.cpp # -> worked without tasks/ prefix, same for HEADERS
HEADERS += \
[...]
api/taskcreator.h \
[...]
tasks/task71.h
[...]
INCLUDEPATH += \
api \
tasks
Теперь, когда я пытаюсь вернуть структуру подпапок, как это было раньше, я все еще получаю ошибки сегментации в том же месте.
ROOT ПРИЧИНА ОБНАРУЖЕНА
Неисправность не связана напрямую со структурой проекта, она произошла из-за инициализации stati c фиаско заказа , где регистрация задачи по макросу произошла до того, как stati c переменная _taskMap
была инициализирована глобально. Изменение структуры файла продукта, вероятно, усугубило проблему с плохим кодом. как описано здесь .