[英]Access struct property by variable value
我的课程中有4个属性的结构“边距”。 我没有写出四种不同的getter / setter方法,而是认为我可以用更好的方式做到:
class myClass {
private:
struct margin {
int bottom;
int left;
int right;
int top;
}
public:
struct getMargin();
void setMargin(string which, int value);
};
但是如何在函数setMargin()
设置与字符串“which”对应的struct的属性? 例如,如果我调用myClass::setMargin("left", 3)
,我怎么能将“margin.left”设置为“3”? 最好在保持结构POD的同时 ? 我真的无法弄清楚这一点......
从旁注来看,这真的比编写许多getter / setter方法更好吗?
谢谢!
首先,你的想法很糟糕...... :)
请注意,您甚至没有margin
会员(在下面添加)
如果您不想为每个属性设置setter / getter,我会使用enum
:
class myClass {
private:
struct margin {
int bottom;
int left;
int right;
int top;
} m; // <--- note member variable
public:
enum Side
{
bottom, left, rigth, top
};
struct getMargin();
void setMargin(Side which, int value);
};
并在setMargin
有一个switch
语句。
void myClass::setMargin(Side which, int value)
{
switch (which)
{
case bottom:
m.bottom = value;
break;
//....
}
}
class myClass {
private:
int margin[4];
public:
enum Side
{
bottom, left, rigth, top
};
void setMargin(Side which, int value);
};
void myClass::setMargin(Side which, int value)
{
margin[which]=value;
}
无论是Luchian还是Gir的建议都是我的偏好。 但是,如果你真的想要一个字符串查找,最好用关联容器来做。
class MyClass {
std::map<std::string, int> m_;
public:
bool setMargin(std::string which, int value) {
std::map<std::string, int>::iterator i = m_.find(which);
if (i == m_.end()) return false;
i->second = value;
return true;
}
};
这仅在您拥有允许用户按名称定义自己的边距的动态界面时才有用。
您可以使用“相对指针”指向距离struct的地址到特殊元素的距离。 例如:
SetMargin(FIRST,5);
哪个FIRST来自枚举值,为0。
SetMargin(SECOND,100);
SECOND是4,因为int是我系统中的4个字节
执行:
void SetMargin(enum margin_elements,int a)
{
int *relative=struct_pointer+(int*)margin_elements;
*relative_pointer=a;
return;
}
如果你可以公开保证金,你可以摆脱get,set方法:
class myClass {
public:
struct Margin {
int bottom;
int left;
int right;
int top;
};
Margin margin;
};
myClass mc;
mc.margin.bottom = mc.margin.left;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.