能否通过std::map修改结构体的成员变量?
问题分析
你当前代码无法更新原结构体的核心原因是:std::map<std::string, const char*>存储的是结构体成员指针的副本——也就是studentInfo->name和studentInfo->address这些指针本身的值。修改map中item.second的值,只会改变map内部条目的指针指向,和原结构体的成员变量没有任何关联,自然无法更新原结构体。
解决方案
要实现通过map修改结构体成员,需要让map存储指向结构体成员指针的指针(即const char**类型),这样就能直接操作原结构体的成员变量。
修正后的代码
typedef struct WWCryptoAuthorizationHeader { int age; const char *name; const char *address; } StudentInfo; void foo(StudentInfo *studentInfo, const char* key) { std::map<std::string, const char**> studentInfoMap; // 存储结构体成员指针的地址,而非指针的值 studentInfoMap["name"] = &studentInfo->name; studentInfoMap["address"] = &studentInfo->address; // 查找目标key,比遍历更高效 auto it = studentInfoMap.find(key); if (it != studentInfoMap.end()) { // 解引用指针的指针,修改原结构体的成员 *(it->second) = "John"; } }
关键说明
- map类型调整:将map的value类型改为
const char**,这样存储的是结构体中const char*成员的内存地址,而非指针指向的字符串地址。 - 插入条目方式:用
&studentInfo->name获取成员指针的地址存入map,建立map条目与原结构体成员的直接关联。 - 修改操作:找到目标条目后,通过
*(it->second)解引用指针的指针,直接修改原结构体的成员指针指向,从而更新结构体内容。
注意:如果需要修改字符串的内容(而非指针指向),
const char*类型是不允许的,因为const修饰了指向的内容不可修改。这种情况下应该改用char[]或std::string类型作为结构体成员。
内容的提问来源于stack exchange,提问作者mammoth
相关产品推荐
相关产品推荐

