按变量值访问struct属性

时间:2012-08-13 18:51:29

标签: c++ struct getter-setter

我的课程中有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方法更好?

谢谢!

5 个答案:

答案 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;