gpt4 book ai didi

c++ - 在 std::map 中存储指向派生类实例的指针

转载 作者:太空宇宙 更新时间:2023-11-04 11:24:39 25 4
gpt4 key购买 nike

我有以下一段代码。我已经抽象出来,我的类看起来像这样:

#include<iostream>
#include<map>

using namespace std;

template <class K>
class Base {
private:
static std::map<std::string, Base*> derived_map;
//other private data
public:
Base(std::string modName) {
if (derived_map.find(modName) == derived_map.end())
{
derived_map.insert(make_pair(modName, this));
}
}

};

template <class K> std::map<std::string, Base<K>*> Base<K>::derived_map;

class Derived: public Base<Derived>
{
public:
Derived(std::string modname): Base<Derived>(modname)
{
}
};


Derived obj("derived1"); // <<< This casuses segfault
int main()
{
}

当我全局声明 Derived obj 时,它会出现段错误。当我在 main 中声明 Derived obj 时,它没有。我无法弄清楚我可能做错了什么。我正在尝试使用 std::map 在我的基类中维护派生类指针列表。有什么线索吗?

最佳答案

您有 2 个具有依赖性的全局变量:

obj要求 Base<Derived>::derived_map正确初始化。

跨翻译单元的全局初始化以未定义的顺序完成。

你可以用类似的东西来解决你的代码:

template <class K>
class Base {
private:
static std::map<std::string, Base*>& get_derived_map()
{
static std::map<std::string, Base*> derived_map; // initialized the first time
// get_derived_map is called
return derived_map;
}
//other private data
public:
explicit Base(const std::string& modName) {
get_derived_map().insert(make_pair(modName, this));
}
};

关于c++ - 在 std::map 中存储指向派生类实例的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27119693/

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