gpt4 book ai didi

c++ - 使用派生类类型初始化模板类的静态数组

转载 作者:行者123 更新时间:2023-11-30 03:59:18 25 4
gpt4 key购买 nike

我有一个带有 main 函数的程序,它只打印一个字符串。当我运行这个程序时,它在控制台没有输出的情况下崩溃了。当我将一个元素插入到 OperatorCore (symbolMap) 的映射中时,我发现问题发生了。

这是最少的代码:

//Binary.hpp
class Binary final : public OperatorCore, public StaticPool<Binary> {
public:
Binary(int ID, std::string name)
: OperatorCore(name), StaticPool<Binary>(ID) {
}
~Binary() {}
};
//Binary.cpp
template<>
const Binary StaticPool<Binary>::pool[] = {
Binary(0, "a string value")//without this line of code, it prints works
};

//OperatorCore.hpp
class OperatorCore {
public:
static std::map<std::string, OperatorCore*> symbolMap;
const std::string name;
OperatorCore (std::string name);
virtual ~OperatorCore () {}
};
//OperatorCore.cpp
std::map<std::string, OperatorCore*> OperatorCore::symbolMap{};
OperatorCore::OperatorCore(std::string name) : name(name) {
symbolMap.insert({name, this});
}


//StaticPool
template<typename T, typename TKey = int>
class StaticPool {
public:
const TKey ID;
static const T pool[];
StaticPool(TKey ID) : ID(ID) {}
virtual ~StaticPool() {}
};

如果我删除其中一个突出显示的行,则不会出现该问题。这种设计会导致内存损坏吗?

编辑:OperatorCore::symbolMap 的初始化与 OperatorCore 构造函数的实现位于同一个文件中。

最佳答案

我怀疑您有初始化顺序问题。换句话说,您的程序尝试在 symbolMap 之前初始化 pool,并且 Binary 对象的构造函数调用基本构造函数,它尝试使用symbolMap,尚未构建。

对此有多种解决方案。最好的办法可能是将 symbolMap 静态成员转换为特殊 getter 函数内的静态变量:

class OperatorCore {
public:
static std::map<std::string, OperatorCore*>& symbolMap() {
static std::map<std::string, OperatorCore*> instance;
return instance;
}
};

关于c++ - 使用派生类类型初始化模板类的静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26974039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com