簡體   English   中英

按變量值訪問struct屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM