gpt4 book ai didi

c++ - std::map 只读位置的分配

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:36 25 4
gpt4 key购买 nike

我有一个 static std::map<std::string, CreateGUIFunc>在一个基本上包含标识 gui 类型的字符串的类中,CreateGUIFunc 是对工厂函数的引用。

在我的构造函数中有

if ( m_factoryRef.size() == 0 ) {
m_factoryRef["image"] = &CreateGUI<Image>;
m_factoryRef["button"] = &CreateGUI<Button>;
}
...

但是,这给了我一个错误提示 assignment of read-only location ‘GUIManager::m_factoryRef.std::map<_Key, _Tp, _Compare, _Alloc>::operator[] [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = GUI*(), _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, GUI*()> >](((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)(& std::basic_string<char, std::char_traits<char>, std::allocator<char> >(((const char*)"image"), ((const std::allocator<char>&)((const std::allocator<char>*)(& std::allocator<char>())))))))’|

我不确定为什么这是只读作业。我还尝试将其更改为普通成员,只是想看看它是否与它是静态的有关,但同样如此。

问题是什么?

编辑:一些定义让事情更清楚

// these are all private

typedef GUI* CreateGUIFunc();

template<class T>
GUI* GUIManager::CreateGUI( std::string &filepath, int x, int y ) {
return new T( filepath, x, y );
}

static std::map<std::string, CreateGUIFunc> m_factoryRef;

附言如果有任何更简洁的方法来初始化静态 map ,请告诉我。

最佳答案

以下是当前 C++ 的一些替代初始化。当您说您的代码在构造函数中时,我不确定您所说的“静态”初始化是什么意思。我有一些猜测,但没关系。选择您觉得“更干净”的东西。

if (m.empty()){
m.insert (map<K,V>::value_type (k1, v1));
m.insert (map<K.V>::value_type (k1, v1));
}

或者,

map<K,V>&  getmap() {
static map<K,V>* m = 0;
if (!m){
m = new map<K,V>(); // never deleted.
// insert.
}
return *m;
}

或者,

namespace /*anon*/ {
map<K,V>* init_map () {
map<K,V>* m = new map<K,V>();
// insertions here.
return m; // return by val. can move in c++0x.
}
}

map<K,V> Foo::m = *init_map ();

或者,

namespace /*anon*/ {
map<K,V>* init_map () {
map<K,V>* m = new map<K,V>();
// insertions here.
return m; // return by val. can move in c++0x.
}
}

map<K,V>& Foo::get_map () { /* static singleton accessor */
static map<K,V> * m = init_map ();
return *m;
}

模式应该是显而易见的。您必须解决两个问题:仅初始化该死的东西一次的微不足道的问题,以及防止静态初始化顺序失败的棘手问题。我个人的偏好类似于上面的第二种情况。

关于c++ - std::map 只读位置的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3122155/

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