7

クラスに 4 つのプロパティを持つ構造体「マージン」があります。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」に設定するにはどうすればよいですか? できれば構造体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);

私のシステムでは int が 4 バイトであるため、SECOND は 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 に答える