Ini*_*ian 4 c++ pointers stdmap c++11 emplace
我正在尝试将指针对象插入到map通过emplace()但它不起作用.
我在下面创建了一个简单的问题表示.我正在尝试插入newFooList指针对象类型Foo*.
我似乎找不到为FooMap*in 创建类型的方法std::map<int, FooMap*> m_fooMapList.是否应该使用new地图的第二个字段?
#include <iostream>
#include <utility>
#include <stdint.h>
#include <cstdlib>
#include <map>
class Foo
{
private:
int m_foobar;
public:
Foo(int value)
{
m_foobar = value;
}
void setfoobar(int value);
int getfoobar();
};
class FooMap
{
private:
std::map<int, Foo*> m_newFoo;
public:
FooMap() = default;
};
class FooMapList
{
private:
std::map<int, FooMap*> m_fooMapList;
public:
FooMapList() = default;
void insertFoo(Foo* newFooObj);
};
int Foo::getfoobar(void)
{
return(m_foobar);
}
void FooMapList::insertFoo(Foo* newFooObj)
{
if(m_fooMapList.empty())
{
std::cout << "m_fooMapList is empty" << std::endl ;
}
//m_fooMapList.emplace( newFooObj->getfoobar(), newFooObj );
// Need to find a way to insert newFooObj to m_fooMapList
m_fooMapList.second = new FooMap;
}
int main() {
FooMapList newFooList;
for (auto i=1; i<=5; i++)
{
Foo *newFoo = new Foo(i);
newFoo->getfoobar();
newFooList.insertFoo(newFoo);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在g ++(GCC)4.8.5 20150623(Red Hat 4.8.5-28)
$ g++ -std=c++11 -Wall map_of_map.cpp
map_of_map.cpp: In member function ‘void FooMapList::insertFoo(Foo*)’:
map_of_map.cpp:51:18: error: ‘class std::map<int, FooMap*>’ has no member named ‘second’
m_fooMapList.second = new FooMap;
Run Code Online (Sandbox Code Playgroud)
m_fooMapList 被定义为
std::map<int, FooMap*> m_fooMapList;
Run Code Online (Sandbox Code Playgroud)
所以要插入它,你需要int一个指针FooMap:
m_fooMapList.emplace(newFooObj->getfoobar(), new FooMap);
Run Code Online (Sandbox Code Playgroud)
话虽如此,你应该使用C++值语义并减少对原始指针的依赖:
std::map<int, FooMap> m_fooMapList; // no pointers
m_fooMapList.emplace(newFooObj->getfoobar(), {}); // construct objects in-place
Run Code Online (Sandbox Code Playgroud)
也就是说,实例FooMap可以直接驻留在地图本身中.
这样您可以获得更好的性能并避免内存泄漏.
unique_ptr如果你真的想使用指针,也值得研究智能指针(例如).