4

私は流暢なインターフェースパターンで遊んでいます。

まず、私はそのようなものを書きました:

class C
{
public:
    C() { }

    C* inParam1(int arg1){ param1 = arg1; return this; }
    C* inParam2(int arg2){ param2 = arg2; return this; }

private:
    int param1;
    int param2;
}

次に、std :: unique_ptrを使用しようとしましたが、チェーンに沿ってポインター(this)を「シフト」する方法がわからないことに気付きました。私は次のようなことを試しました:

return std::move(this);

もちろんそれは機能しません。

これどうやってするの?このようなことをするのに何か問題はありますか?

「ポインタを使わないでください」のようなコメントに返信するために:私はポインタを使ってこれを行っているので、(まだ)実用的な理由はありませんが、この方法でできるかどうか疑問に思っています。

4

3 に答える 3

10

なぜポインタを返さなければならないのですか?

class C
{
public:
    C create() { return C(); }

    C & inParam1(int arg1){ param1 = arg1; return *this; }
    C & inParam2(int arg2){ param2 = arg2; return *this; }

private:
    C() { }
    int param1;
    int param2;
};

そのcreate関数の目的、コンストラクターがプライベートである理由、またはこのクラスのオブジェクトを実際に作成する方法をまったく理解していないことを認めなければなりません。私の理解では、クラスは実際には次のようになっているはずです。

class C
{
public:
    C() {}

    C & inParam1(int arg1){ param1 = arg1; return *this; }
    C & inParam2(int arg2){ param2 = arg2; return *this; }

private:        
    int param1;
    int param2;
};

そしてこのように使用されます:

int main()
{
    C().inParam1(10).inParam2(20).whatever();
}
于 2012-05-04T14:18:18.130 に答える
2

特定のインスタンスに対して存在できるインスタンスは1つだけstd::unique_ptrです(それぞれがインスタンスを削除しようとし、それは1回しか実行できないため)。したがって、をcreate返すことはできstd::unique_ptrますが、他の2つのメソッドは返すことができません。

他のメソッドがポインタではなく参照を返さない理由はありますか?そして、なぜあなたはただパブリックコンストラクターを持っていないのですか?createこの例では、メソッドの値がわかりません。

于 2012-05-04T14:18:57.560 に答える
1

あなたはC++の流暢なインターフェースの例から1つの重要な考えを逃しました:

//it doesn't make sense to chain after create(), so don't return *this

したがって、メソッドから何も返さないでくださいcreate()

ただし、それでも何かを返したい場合は、少なくとも(誤)使用せずunique_ptrに、新しいオブジェクトを返すだけです。

C create() { return C(); }
于 2012-05-04T14:22:27.193 に答える