1

いくつかのデータメンバーを持つクラスがあり、一方を返すクラスメソッドが必要で、次に呼び出されたときにもう一方の値を返すとします。何かのようなもの:

class MyClass
{
    public:
        MyClass():switch(0){};
        int get();
    private:
        int intA, intB;
        int sw;
};        
int MyClass::get()
{ 
    if ( (++sw)%2 )
        return intA;
    else
        return intB;
}

それを行うためのよりエレガントな方法は何でしょうか?if...elseステートメントはあまり好きではありません。returnのようなものには問題ありませんが、実際にもっと複雑な操作を使用している場合は、大量のコードを複製することになります。または、ポイントしている要素を解決した後に呼び出される2番目のメソッドを各メソッド内に作成する必要があります。

私がやりたいのは、理想的には、何らかの形のポインターを使用することです。

class MyClass
{
    public:
        MyClass():switch(&intA){};
        int get();
        void toggleSwitch();
    private:
        int intA, intB;
        int * sw;
};        
int MyClass::get()
{
    return *sw;
}
void MyClass::toggleSwitch()
{
    if ( sw == &intA )
        sw = &intB;
    else
        sw = &intA;
}

またはその効果への何か。私はtoggleSwitch()を呼び出すことができ、クラスにどちらかの値を簡単に操作させることができます。

私はまだそれが好きではありません。可能であれば避けたいのですが、この場合は必要ありません。このネイキッドポインタの使用はかなり安全なはずですが、std :: unique_ptrのように各要素を保持してから、それらをstd::swapすることができると考えていました。しかし、その場合、ポインタは要素を所有し、代わりに動的メモリになります。

それで、それを行うためのより良い方法はありますか?

4

2 に答える 2

3

さて、switchキーワードですが、私はそれで転がります。ポインタの配列はどうですか?

int *fields[] = {&intA, &intB};

int MyClass::get()
{
    return *fields[++switch % 2];
}

後で追加の変数を使用できる場合、これはうまく拡張されます。

または多分:

int MyClass::get()
{
    return *fields[switch = 1 - switch];
}

参照を返す場合は、内部でget()を使用できます。

int &MyClass::get()
{
    return *fields[switch = 1 - switch];
}
于 2012-12-20T03:49:48.480 に答える
0

トグル値の概念をカプセル化します。

template<typename T>
class Toggleable {
    T first;
    T second;
    T* current;
    T* other;

public:
    Toggleable(const T& first, const T& second)
    : first(first),
      second(second),
      current(&first),
      other(&second) {
    }

    bool toggle() {
        std::swap(current, other);
    }

    const T& get() const {
        return *current;
    }
}

次に、次のように使用します。

class MyClass
{
    Toggleable<int> value;

    public:
        MyClass()
        : value(42, 1729)
        {
        }

        const int& get() {
            value.toggle();
            return value.get();
        }
};    
于 2012-12-20T09:52:20.063 に答える