c++ - 在 std::unordered_map 中分配 ID 后创建对象

标签 c++ c++11 dictionary

我有一个 std::unordered_map 存储一个带有对象的整数。这里有一些代码供您理解:

#include <iostream>
#include <unordered_map>
#include <cstdlib>
using namespace std;

class Foo
{
public:
    Foo()
    {
        cout << "Foo created!" << endl;
    }

    ~Foo()
    {

    }
};

typedef std::unordered_map<int, Foo*> FooMap;
FooMap fm;

int allocateID()
{
    cout << "Allocating ID" << endl;
    return rand() % 100;
}

void add()
{
    fm.emplace(allocateID(), new Foo());
}

int main()
{
    srand(time(NULL));

    add();

    return 0;
}

输出:

Foo created!
Allocating ID

这里的问题是对象 Foo 是在 分配 ID 之前创建的!我尝试在 allocateID 上添加一个互斥锁;它不起作用,因为 allocateID() 在对象创建后 运行。

如何修改此程序,以便在分配 ID 之后创建 Foo

编辑:

我试过代码并使用此处的解决方案来演示:

void add(int id, Foo *f)
{
    auto iden = id;
    auto foo = f;
    fm[iden] = foo;
}

void add(Foo *f, int id)
{
    auto iden = id;
    auto foo = f;
    fm[iden] = foo;
}

void add()
{
    int id = allocateID();
    fm[id] = new Foo();
}

在第一个 add() 函数中,输出保持不变。这不能解决问题。

在第二个 add() 函数中,输出不同,而是产生:

Allocating ID
Foo created!

而在第三个函数中,它已使用其中一种解决方案进行了修改:该函数也产生了所需的输出。第三个函数的问题是,实际上不太可能有一个空的 add() 函数。解决这个问题的唯一有罪的方法是先传递对象然后 id。这可能是因为无论输入要求如何,参数都是从右到左读取的,因为它们是在读取参数之后创建的。

最佳答案

您不能依赖函数参数的求值顺序。试试这个:

void add()
{
    int temp = allocateID();
    fm.emplace(temp, new Foo());
}

关于c++ - 在 std::unordered_map 中分配 ID 后创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34094159/

相关文章:

c++ - 通用 lambda : syntactic sugar or not?

c++ - 使用 vector::erase 时没有可行的 '='

c++ - 在父函数中获取子对象的大小

c++ - 具有完整 C++11 支持的 Windows C++ 编译器(应该与 Qt 一起使用)

c++ - 不明确的模板实例化

swift - Xcode 如何将按钮添加到 ImageView

python - 获取Python中嵌套字典的值

c++ - Boost ASIO socket 读取 N 字节不多不少,等到它们到来或超时异常?

c++ - 编译器生成构造函数来初始化成员

python - 从python中的字典列表中删除字典