C++初始化对象的静态映射

C++ initialize static map of objects

本文关键字:静态 映射 对象 初始化 C++      更新时间:2023-10-16

我正在尝试创建静态对象的映射map<string, base*>,其中base由类class1class2派生。我的地图将存储指向类型为 class1class2 的对象的指针。

在阅读了几篇文章后,我决定通过创建一个带有静态类函数的单例来初始化映射:

class A {  // singleton class
public:
static map<string, base*> create_map() {
map<string,base*> m;
m["1"]=new class1();
m["2"]=new class2();
};
static const map<string, base*> myMap;
};
int main() {    
const map<string,base*> A::myMap = A::create_map();
myMap["1"]->func();    
}

但是,这会产生一个错误:myMap is not declared in this scope 。有人可以解释单例方法以及我做错了什么吗?如果我有一个单独的头文件,这将如何变化?
蒂亚。

编辑:将代码更改为:

class A {  // singleton class
public:
static map<string, base*> create_map() {
map<string,base*> m;
m["1"]=new class1();
m["2"]=new class2();
return m;
};
static const map<string, base*> myMap;
};
const map<string,base*> A::myMap = A::create_map();
int main() {    
A::myMap["1"]->func();    
}

这仍然会给出一个错误:passing const std::map<std::basic_string<char>, base*> as 'this' discards qualifiers.

您应该在类之后添加行map<string, base*> A::myMap;。您还应该避免映射对象的 const 声明,并且缺少 create_map() 方法的 return 语句

class A {  // singleton class
public:
    static map<string, base*> create_map() {
        map<string,base*> m;
        m["1"] = new class1();
        m["2"] = new class2();
        return m;
    }
    static map<string, base*> myMap;
};
map<string, base*> A::myMap;
int main() {
    A::myMap = A::create_map();
    A::myMap["1"]->func();
    return 0;
}

myMap 是 A 的成员,你需要相应地解决它。

A::myMap["1"]->func();