插入元素后Unordered_map变空,我在做什么错?

时间:2018-12-22 09:09:09

标签: c++

我有一个unordered_map对象,我将其填充到某处,当我查找放置的内容时,地图为空。

我有一个ClassA对象,其中有一个ClassB私有成员。 ClassB有一个ClassC*的私有成员和一个unordered_map<std::string, ClassC*>私有成员。它还具有公共功能insertClassC(std::string name, ClassC* o)setActiveClassC(std::string name)。我的main()函数有一个ClassC对象,调用insertClassC(),然后调用setActiveClassC()

int main()
{
    ClassC mainClassC;
    try
    {
        ClassA app;
        app.getClassB().insertClassC("main", &mainClassC);
        app.getClassB().setActiveClassC("main");
    } catch (const std::exception& e)
    {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

ClassB ClassA::getClassB()
{
    return classBObject; // private member of ClassA
}

void ClassB::insertClassC(std::string name, ClassC* o)
{
    // classCMap is an unordered_map<std::string, ClassC*>, private member of ClassB
    classCMap.insert(std::pair<std::string, ClassC*> (name, o)); 
}

void ClassB::setActiveClassC(const std::string name)
{
    std::unordered_map<std::string, ClassC*>::const_iterator res = classCMap.find(name);
    if(res == classCMap.end())
    {
        char err [50];
        sprintf(err, "ClassC \"%s\" could not be found", name.c_str());
        throw std::runtime_error(err);
    }
    active = res->second;
}

我希望该程序返回EXIT_SUCCESS,但它返回EXIT_FAILURE并打印到stderr:

ClassC "main" could not be found

调试时,可以看到classCMap的大小在insertClassC()调用结束时为1,但是在我调用setActiveClassC()时为0。

我怀疑我对指针的理解是错误的(我是C ++的初学者),所以我读了一些有关该知识的文章,但我仍然不理解我的错误。

1 个答案:

答案 0 :(得分:2)

好的,所以我决定发表评论:

您的功能

ClassB ClassA::getClassB()
{
    return classBObject; // private member of ClassA
}

具有返回类型ClassB,这意味着它会复制您的私人成员。 但是,由于您要修改成员,因此需要返回对该成员的引用,即您必须编写

ClassB& ClassA::getClassB()
{
    return classBObject; // private member of ClassA
}

注意返回类型上的与号。