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]'
我在windows上使用mingw64进行编译。我试图按照找到here的工厂方法模式进行操作,但是我可以将其扩展为一个不需要对象扩展的宏来手动输入任何一个锅炉板代码。我认为可能Object::registryFormatMap
没有被初始化但是我会期望运行时错误,而不是编译时错误。
我试图创建两个映射,一个字符串格式映射和一个指向构造函数映射的lambda指针,以允许对两个类进行初始化,并将需要通过字符串格式初始化的内容提供给某些外部函数。在一个单独的代码库中,我有很多这些类,并且我试图使其不必每次编辑多个文件时添加一个适合&#34的新类。 ;对象&#34;格式,以前我用的是手动创建的unordered_map
。