0

メソッドで作成された複数のオブジェクトを含むメソッド呼び出しからsignleオブジェクトを返したい。

Results calculate() {

    Foo f;
    Bar b;
    ...
    Results r(f, b);
    return r;
}


class Results {

private:
    ?

public:

    Results(Foo& f, Bar& b);

    Foo? getFoo();

    Bar? getBar();

}

a)Resultsメンバー変数はポインターである必要がありますか?

private:
    Foo* foo;
    Bar* bar;


public:
    Results(Foo& f, Bar& b) {
        this->foo = &f;
        this->bar = &b;
    }

b)getFoo戻る必要がFooありますFoo&Foo*

4

5 に答える 5

4

C ++ 11のタプル(またはブースト、それ以外の場合)を使用すると、基本的にそれらを再実装します。

#include <tuple>

std::tuple<Foo, Bar> calculate() {
    Foo f;
    Bar b;
    ...
    return std::make_tuple(f, b);
}

void test() {
    Foo f;
    Bar b;
    std::tie(f, b) = calculate();
}

これは、3つ以上のオブジェクトを返すように簡単に拡張できることに注意してください。そのため、別の回答で言及されているのでstd::tupleはなく、使用しました。std::pair

于 2013-01-08T13:00:35.310 に答える
2

いいえ、このようにしないでください。calculate()Foo fおよびはローカルオブジェクトであるため、Bar bこの関数から戻ると消えます。にコピーfbますResults

class Results {
private:
    Foo foo;
    Bar bar;

public:
    Results(const Foo& f, const Bar& b) : foo(f), bar(b) {}

    const Foo &getFoo() const { return foo; }
    const Bar &getBar() const { return bar; }
}

より簡単な方法は、を使用しstd::pairて代わりにそれを返すことです。

std::pair<Foo, Bar> calculate() {
    Foo f;
    Bar b;
    ...
    return std::make_pair(f, b);
}
于 2013-01-08T13:00:43.527 に答える
1

a)いいえ。の値を初期化することによりcalculate()、これらの変数は関数の実行が終了したときに「消滅」します。このように、前に初期化したポインタは空のスペースを指します。

b)プライベートメンバーがポインタではないことを考慮して、必要に応じてこれを行うことができます。データをオブジェクト内に「保持」したい場合は、ポインターまたは参照を使用できます(どちらでも構いません)。それ以外の場合は、「通常の」変数を使用します。

于 2013-01-08T13:00:41.230 に答える
0

私はあなたが何を達成しようとしているのかまだ少しわかりませんが、現在あなたは問題にぶつかるでしょう:aとbは計算のスタックにあり、あなたは本質的にそれらへのポインタを返します。しかし、計算が終了してスコープから外れるとすぐに、ワイルドポインターができますabそれは非常に悪いです。
スマートポインタを作成し、より多くの戻り値がある場合はオブジェクトに返します。または、とに
ポインタを渡して、計算でヒープ上にオブジェクトを計算および作成します。ただし、自分で削除する必要があることに注意してください。そうしないと、メモリリークが発生します。したがって、基本的に、に3つ以上のオブジェクトがある場合は、またはのようなスマートポインタを追加します(またはC ++ 11を使用しない場合) 。abnewresultstd::auto_ptrstd::shared_ptrboost::shared_ptr

于 2013-01-08T13:01:37.783 に答える
0

a)結果のメンバー変数は、値によって保持される必要があります。それ以外の場合は、ローカルのスコープ外データのアドレス(または参照)を返します。

b)getFooは、オブジェクトへのconst参照を返すか、PODタイプの場合は値で返す必要があります。

そうは言っても、Foo&およびBar&タイプのI / Oパラメーターを受け入れるようにインターフェースを変更し、変数を内部に入力し、それらを返さないようにすることを検討してください。これにより、他の方法で必要となる戻り値の2つのコピーを回避できます。

Resultsクラスをstd::tuple:に置き換えることもできます。

std::tuple<Foo,Bar> calculate() {

    Foo f;
    Bar b;
    ...
    return std::tuple(f,b);
}

// client code:
Foo foo;
Bar bar;

std::tie(foo, bar) = calculate();

編集:C ++ 11(for)を使用しない場合は、代わりにstd::tuple検討してください。boost::tuple

于 2013-01-08T13:07:48.840 に答える