Статическая фабричная структура не компилируется
object.h
#ifndef TESTFACTORYMETHOD_OBJECT_H
#define TESTFACTORYMETHOD_OBJECT_H
#include <string>
#include <unordered_map>
#include <functional>
class Object;
using RegistryFormatMap = std::unordered_map<std::string, std::string>;
using RegistryConstructorMap = std::unordered_map<std::string, std::function<Object*(const std::string &)>>;
class Object {
public:
static RegistryFormatMap registryFormatMap;
static RegistryConstructorMap registryConstructorMap;
private:
};
#endif //TESTFACTORYMETHOD_OBJECT_H
apple.h
#ifndef TESTFACTORYMETHOD_APPLE_H
#define TESTFACTORYMETHOD_APPLE_H
#include "object.h"
class Apple : public Object{
public:
constexpr static char m_name[6] = "Apple";
std::string m_test_val;
class Factory {
public:
Factory(){
std::string temp = m_name;
Object::registryFormatMap[temp] = "test_apple";
Object::registryConstructorMap[temp] = ([](const std::string &in) -> Apple * { return new Apple(in); });
}
};
static Factory factory;
explicit Apple(const std::string& str) {
m_test_val = str;
}
private:
};
#endif //TESTFACTORYMETHOD_APPLE_H
main.cpp
#include <iostream>
#include "object.h"
int main() {
for(const std::pair<std::string, std::string>& pair : Object::registryFormatMap) {
std::cout << pair.second << std::endl;
}
return 0;
}
Я получаю следующую ошибку
:main.cpp:(.rdata$.refptr._ZN6Object17registryFormatMapB5cxx11E[.refptr._ZN6Object17registryFormatMapB5cxx11E]+0x0): undefined reference to `Object::registryFormatMap[abi:cxx11]'
Я использую mingw64 на Windows для компиляции. Я пытаюсь следовать шаблону фабричного метода, найденному здесь, но таким образом, что я могу развернуть его последним в макрос, который не требует расширений объекта для того, чтобы вручную вводить любой код котельной плиты. Я думаю, что это возможно, что Object::registryFormatMap
не инициализируется, но тогда я ожидал бы ошибки времени выполнения, а не ошибки времени компиляции.
Я пытаюсь сделать две карты, карту формата строки и лямбда-указатель на карту конструктора, чтобы позволить классам быть инициализированными и дать то, что им нужно инициализировать через формат строки, какой-либо внешней функции. В отдельной кодовой базе у меня есть много этих классов, и я пытаюсь сделать так, чтобы мне не приходилось редактировать несколько файлов каждый раз, когда я добавляю новый класс, который соответствует формату "Объект", ранее я использовал созданный вручную unordered_map
s.