7

我的班级中有一个结构“margin”,有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);
};

但是我怎样才能在函数中设置与字符串“which”对应的结构的属性setMargin()呢?例如,如果我调用myClass::setMargin("left", 3),我该如何将“margin.left”设置为“3”?最好在保持 struct POD的同时?这个我真的想不通...

顺便说一句,这真的比编写许多 getter/setter 方法更好吗?

谢谢!

4

5 回答 5

10

首先,你的想法很糟糕...... :)

请注意,您甚至没有margin会员(在下面添加)

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;
    //....
    }
}
于 2012-08-13T18:55:09.420 回答
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;
}
于 2012-08-13T19:05:32.807 回答
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;
    }
};

仅当您有一个允许用户按名称定义自己的边距的动态界面时,这才有用。

于 2012-08-13T19:23:14.743 回答
0

您可以使用“相对指针”,它指向从结构地址到指向特殊元素的距离。例如:

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;
 }
于 2012-08-13T18:57:20.437 回答
0

如果您可以公开保证金,则可以摆脱 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;
于 2012-08-13T18:58:27.867 回答