C++:如何访问名称存储在数组中的成员变量

C++: How to access a member variable whose name is stored in an array

本文关键字:数组 存储 变量 成员 何访问 访问 C++      更新时间:2024-09-23

假设我有一个字符串数组,如下所示:

string registers[2] = {"r0","r1"}

像这样的结构:

struct cpu {
int r1;
}

我试过这样的东西:

cpu *p = (cpu*)malloc(sizeof(cpu));
cout << p->registers[1] << endl;

但这导致了一个编译错误。如何实现?

编辑:问题描述

我需要使用索引访问cpu类的成员,所以我想我可以把成员的名称放在一个数组中,然后使用索引获得成员的名称

您的代码完全错误。表达式p->registers使用默认运算符->,该默认运算符要求左手运算符作为指向某个类型的指针,该类型将使用名称为的成员作为右手运算符(registers(。您的cpu不包含registers

无论出于何种原因,模仿你渴望的行为的步骤:

  1. 设计了一种方法,通过索引或指向成员的指针将特定的stringcpu的成员关联起来
  2. 将字符串值映射到指向成员的索引或指针
  3. C++允许使用成员运算符对其进行封装,这将导致类似p["r0"]的内容产生对r0的引用

在最简单的情况下,当所有元素都是同一类型时,您可以只使用std::map或类似设计的类,例如

struct cpu {
std::map<std::string, int> registers;
// constructor initializes the map
cpu() : registers ( { {"r0", 0}, 
{"r1", 0} 
}) 
{}
};

这里表达式CCD_;r0";密钥等

NBcpu对象的创建应该是

cpu *p = new cpu();

下面是一个使用字符串到cpu成员的映射的示例:

#include <iostream>
#include <string>
#include <map>
using namespace std;
struct cpu {
int r0;
int r1;
};
map<string,int cpu::*> registers = {
{"r0",&cpu::r0},
{"r1",&cpu::r1}
};
int main()
{
cpu x{0, 1};
cout << " x.r1 = " << x.r1 << ",  x.*registers["r1"] = " << x.*registers["r1"] << "n";
x.*registers["r1"] = 2;
cout << " x.r1 = " << x.r1 << ",  x.*registers["r1"] = " << x.*registers["r1"] << "n";

cpu *p = &x;
p->*registers["r1"] = 3;
cout << "p->r1 = " << p->r1 << ", p->*registers["r1"] = " << p->*registers["r1"] << "n";

return 0;
}

请在此处尝试:https://onlinegdb.com/d2KqBH0Mo

这里有一个,就像你最初的例子一样,使用整数索引到数组中:

#include <iostream>
#include <string>
#include <map>
using namespace std;
struct cpu {
int r0;
int r1;
};
int cpu::* registers[] = {
&cpu::r0,
&cpu::r1
};
int main()
{
cpu x{0, 1};
cout << " x.r1 = " << x.r1 << ",  x.*registers[1] = " << x.*registers[1] << "n";
x.*registers[1] = 2;
cout << " x.r1 = " << x.r1 << ",  x.*registers[1] = " << x.*registers[1] << "n";

cpu *p = &x;
p->*registers[1] = 3;
cout << "p->r1 = " << p->r1 << ", p->*registers[1] = " << p->*registers[1] << "n";

return 0;
}

请在此处尝试:https://onlinegdb.com/3hWpmEijs