Статическая фабричная структура не компилируется

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_maps.

0 ответов

Другие вопросы по тегам