Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在无序列表中存储和传递引用而不是值_C++_Pass By Reference_Unordered Map - Fatal编程技术网

C++ C++;在无序列表中存储和传递引用而不是值

C++ C++;在无序列表中存储和传递引用而不是值,c++,pass-by-reference,unordered-map,C++,Pass By Reference,Unordered Map,我有一些编译和运行良好的代码,但按值传递对象: AssetRepository AssetRepositoryFactory::getAssetRepository(std::string clientId) { std::unordered_map<std::string, AssetRepository>::iterator iterator = m_repositories.find(clientId); if ( iterator != m_repositor

我有一些编译和运行良好的代码,但按值传递对象:

AssetRepository AssetRepositoryFactory::getAssetRepository(std::string clientId)
{
    std::unordered_map<std::string, AssetRepository>::iterator iterator = m_repositories.find(clientId);
    if ( iterator != m_repositories.end())
    {
        return iterator->second;
    }
    else
    {
        AssetRepository repository = AssetRepository(clientId);
        std::pair<std::string, AssetRepository> pair (clientId, repository);
        m_repositories.insert(pair);
        return repository;
    }

}
如果我叫它via

AssetRepository repository = AssetRepositoryFactory::getInstance().getAssetRepository("clientId0");
或者,如果我打电话

AssetRepository &repository = AssetRepositoryFactory::getInstance().getAssetRepository("clientId0");
我明白了

First-chance exception at 0x000007FEE72EAD7B (RTDynamics-vc11-md-64.dll) in CGF_flight_controller.exe: 0xC0000005: Access violation reading location 0x0000000000000028.
Unhandled exception at 0x000007FEE72EAD7B (RTDynamics-vc11-md-64.dll) in CGF_flight_controller.exe: 0xC0000005: Access violation reading location 0x0000000000000028.

由于我通常是一名Java开发人员,我很难理解如何通过引用显式传递。有人能帮我弄清楚吗?

这个代码完全错了

AssetRepository& function() {
    [...]
    AssetRepository repository = [...];
    [...]
    return repository; // by reference
    // but "repository" gets destroyed...
}
在函数返回后,返回对不存在的对象的引用。不要那样做。这被称为“悬挂参考”(将其放入谷歌)。只能使用对现有对象的引用。

问题在于:

std::unordered_map<std::string, AssetRepository&>
std::无序映射
容器的值应为。但是引用是不可分配的。在声明它们时只能初始化它们一次,以后不能使它们引用其他内容

但你有一些解决办法:

  • 在工作代码中使用值。和用于降低复制值的成本

  • 在地图中使用指向AssetPository的指针:

    std::无序地图

  • 用于使引用可分配


有关更多信息和解决方案,请查看此问题:

我最终找到了一个解决方案,并合并了关于悬空引用的评论和使用指针的建议

AssetRepository* AssetRepositoryFactory::getAssetRepository(std::string clientId)
{

    std::unordered_map<std::string, AssetRepository>::iterator iterator = m_repositories.find(clientId);
    if ( iterator != m_repositories.end())
    {
        AssetRepository repository = iterator->second;
        return &(iterator->second);
    }
    else
    {
        AssetRepository repository = AssetRepository(clientId);
        std::pair<std::string, AssetRepository> pair (clientId, repository);
        m_repositories.insert(pair);
        return getAssetRepository(clientId);
    }

}
AssetPository*AssetPositionFactory::GetAssetPository(std::string clientId)
{
std::unordered_map::iterator iterator=m_repositories.find(clientId);
if(迭代器!=m_repositories.end())
{
AssetRepository repository=iterator->second;
返回&(迭代器->秒);
}
其他的
{
资产存储库=资产存储库(clientId);
std::pair对(clientId,repository);
m_存储库。插入(对);
返回getAssetRepository(clientId);
}
}

我想这与类的定义有关
AssetPository
。请把它寄出去。
std::unordered_map<std::string, AssetRepository&>
AssetRepository* AssetRepositoryFactory::getAssetRepository(std::string clientId)
{

    std::unordered_map<std::string, AssetRepository>::iterator iterator = m_repositories.find(clientId);
    if ( iterator != m_repositories.end())
    {
        AssetRepository repository = iterator->second;
        return &(iterator->second);
    }
    else
    {
        AssetRepository repository = AssetRepository(clientId);
        std::pair<std::string, AssetRepository> pair (clientId, repository);
        m_repositories.insert(pair);
        return getAssetRepository(clientId);
    }

}