我的课程中有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方法更好?
谢谢!
答案 0 :(得分:9)
首先,你的想法太糟糕了...... :)
请注意,您甚至没有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);
};
并在switch
内有setMargin
声明。
void myClass::setMargin(Side which, int value)
{
switch (which)
{
case bottom:
m.bottom = value;
break;
//....
}
}
答案 1 :(得分:3)
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;
}
答案 2 :(得分:1)
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;
}
};
这仅在您拥有允许用户按名称定义自己的边距的动态界面时才有用。
答案 3 :(得分:0)
您可以使用“relative pointer”,它指向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;
}
答案 4 :(得分:0)
如果你可以公开保证金,你可以摆脱get,set methods:
class myClass {
public:
struct Margin {
int bottom;
int left;
int right;
int top;
};
Margin margin;
};
myClass mc;
mc.margin.bottom = mc.margin.left;