我已经构建了一个类工厂,它使用map的本地静态对象来保存它可以创建的所有类的名称:
typedef std::map<std::string, ClassFactory*> typeMap;
static typeMap& getMap() {
static typeMap map;
return map;
}
类必须使用以下代码注册到地图:
DerivedRegistering(std::string const& s) {
std::cout << "Inserting " << s << std::endl;
std::cout << "Map size " << getMap().size() << std::endl;
getMap().insert(std::make_pair(s, this));
}
如果我想创建一个新实例,我调用该类的静态createInstance
函数:
static Object* createInstance(std::string const& s) {
std::cout << "Current map size " << getMap().size() << std::endl;
typeMap::iterator it = getMap().find(s);
if(it == getMap().end()) // not registered
return 0;
return it->second->create();
}
假设我已经在库A的头文件中创建了这个类工厂,我将库A动态链接到一个项目,该项目链接另一个动态库B并最终创建一个可执行文件。
现在使用linux下的gcc我没有遇到任何问题,但是当使用mingw为Windows做同样的事情时,我会遇到问题。
gcc的输出:
Registering classes of library B:
Inserting BA
Map size 0
Inserting BB
Map size 1
Inserting BC
Map size 2
Inserting BD
Map size 3
Inserting BE
Map size 4
Registering classes of library A:
Inserting AA
Map size 5
Inserting AB
Map size 6
Inserting AC
Map size 7
Inserting AD
Map size 8
Inserting AE
Map size 9
Inserting AF
Map size 10
Inserting AG
Map size 11
calling create instance in executable:
Current map size 12
然而在mingw中,我得到了这样的输出:
Registering classes of library B:
Inserting BA
Map size 0
Inserting BB
Map size 1
Inserting BC
Map size 2
Inserting BD
Map size 3
Inserting BE
Map size 4
Registering classes of library A:
Inserting AA
Map size 0
Inserting AB
Map size 1
Inserting AC
Map size 2
Inserting AD
Map size 3
Inserting AE
Map size 4
Inserting AF
Map size 5
Inserting AG
Map size 6
calling create instance in executable:
Current map size 0
所以对我来说,似乎mingw为每个库和可执行文件创建一个新的静态本地映射,而gcc为所有这些映射使用相同的内存。
GCC行为是您可能猜到的所需行为。我可以为mingw强制执行此操作吗?
答案 0 :(得分:4)
您的功能是静态的,包含在多个地方。这意味着您可以创建不同的实体和不同的对象。
在.h中创建函数extern并在.cpp文件中添加单个实体,然后你将有一个单例。
或者,您可以使其内联而不是静态以获得相同的效果。