首页 > 解决方案 > 如何取消引用指向 C++ 中对象指针映射的指针?

问题描述

在下面的示例中,我想使用指针 employeePayroll 访问employeeIDfrom 类Employee

class Employee { ... int employeeID; ... }
std::map<std::string, Employee *> *_employeePayroll;
std::map<std::string, Employee *> _employeeID;
_employeePayroll = &_employeeID;

如何使用给定的密钥访问employeeID,例如打印内容?

标签: c++c++11

解决方案


... (*_employeePayroll)["Karl"]->employeeID ...

注意:这可行,但很危险!一旦密钥“Karl”不存在,它就会使程序崩溃。请在下面找到最后一个代码示例。



使用find迭代器的安全方法:

...
itEmployeeID = _employeePayroll->find("Karl");
if ( itEmployeeID != _employeePayroll->end() )
{
    ... (itEmployeeID->second)->employeeID ...

完整的测试代码在这里:

#include    <iostream>
#include    <string>
#include    <map>

class Employee
{
public:
    int     employeeID;

    Employee()
    {
        employeeID = 123;
    }
};

int main(int argc, char* argv[]) {
    std::map<std::string, Employee *>                   *_employeePayroll;
    std::map<std::string, Employee *>                   _employeeID;
    std::map<std::string, Employee *>::const_iterator   itEmployeeID;

    _employeePayroll = &_employeeID;
    (*_employeePayroll)["Karl"] = new Employee;

    itEmployeeID = _employeePayroll->find("Karl");
    if ( itEmployeeID != _employeePayroll->end() )
    {
        std::cout << (itEmployeeID->second)->employeeID;
        std::cout << std::endl;
    }

    return 0;
}

注意:必须清理分配的内存。



“危险”变种的完整测试代码为:

#include    <iostream>
#include    <string>
#include    <map>

class Employee
{
public:
    int     employeeID;

    Employee()
    {
        employeeID = 123;
    }
};

int main(int argc, char* argv[]) {
    std::map<std::string, Employee *> *_employeePayroll;
    std::map<std::string, Employee *> _employeeID;
    _employeePayroll = &_employeeID;

    int iValue;

    (*_employeePayroll)["Karl"] = new Employee;
    iValue = (*_employeePayroll)["Karl"]->employeeID;
    std::cout << iValue;
    std::cout << std::endl;

    return 0;
}

注意:必须清理分配的内存。


推荐阅读