通过emplace()将对象指针插入到地图的地图中不起作用

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)

rus*_*tyx 5

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如果你真的想使用指针,也值得研究智能指针(例如).