5

2 つの値を返したいのですが、そのうちの 1 つは新しいオブジェクトです。私はこれを使用してこれを行うことができますstd::pair:

class A {
//...
};

std::pair<A*, int> getA()
{
   A* a = new A;
   //...
} 

コードを例外セーフにするために、次のことを行います。

std::pair<std::auto_ptr<A>, int> getA()
{
    std::auto_ptr<A> a(new A); 
    //...
} 

auto_ptrただし、コピーされるものを変更せずにコピーすることはできないため、これはコンパイルされませんauto_ptr。わかりました、これはauto_ptr他のタイプのようにうまく構成できないことを意味します (もう 1 つの点で)。この場合、新しいオブジェクトを返す良い方法は何ですか?

1 つの選択肢は a を返すことでshared_ptrあり、もう 1 つは inout 参照です。しかし、私は他の代替手段を探しています。私は次のようなことができます:

class AGetter
{
    void getAExecute()
    {
         //...
         // set a_ and i_
    }
    std::auto_ptr<A> getA() const
    {
         return a_.release();
    }
    int getInt() const
    {
         return i_;
    }
    private:
    std::auto_ptr<A> a_;
    int i_;
};

より良い方法はありますか?

4

5 に答える 5

5

この問題を処理するには、主に次の 2 つの方法があります。

  1. try/catch を使用して、自分でクリーンアップを行います。
  2. のようなある種の自動化されたメモリ管理を使用しますshared_ptr

auto_ptrあなたが発見したように、この種のケースでは実際には機能しませんが、新しい標準と Boost の両方には、必要な動作をする参照カウント ポインターが含まれています。の気に入らないところをお知らせくださいshared_ptr。別の方法を提案できるかもしれません。

于 2009-06-22T17:47:46.647 に答える
3

そのような状況ではAshared_ptrが理想的ですが、本当にそれらを使用したくない場合はauto_ptr、代わりにオブジェクトと int を含むペアに an を返すことができます。

于 2009-06-22T18:01:03.567 に答える
2

新しいクラスを作成してそのクラスを返すだけです

class Result
{
   A* a;
   int i;
public:
   Result( A*a, int i ) : a(a), i(i) {
   }
   ~Result() { 
      delete a; 
   }
   // access functions, copy constructor, ...
};

Result getA() {
   //...    
   return Result(new A, intValue);  
}
于 2009-06-22T18:55:28.363 に答える
1

きれいではありませんが、ポインターまたは参照引数を介して他の値を返すことができます。

int i;
std::auto_ptr<A> a = getA(&i);
于 2009-06-22T17:45:10.783 に答える
1

2 つの参照パラメーターを使用しないのはなぜですか?

class AGetter
{
    // ..
    void get(std::auto_ptr<A>& a, int& i)
    {
         a = a_.release();
         i = i_;
    }
    // ..
};
于 2009-06-22T17:47:52.700 に答える