5

我想返回两个值,其中一个是一个新对象。我可以这样做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不像其他类型那样组合得很好(以另一种方式)。在这种情况下返回新对象的好方法是什么?

一种选择是返回 a shared_ptr,另一种是 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

有两种主要的方法来处理这个问题:

  1. 通过 try/catch 自己进行清理。
  2. 使用某种自动内存管理,例如shared_ptr.

auto_ptr正如您所发现的那样,在这种情况下并不能真正起作用,但是新标准和 Boost 都包含引用计数的指针,可以满足您的需求。让我们知道您不喜欢什么shared_ptr,也许我们可以提出替代方案。

于 2009-06-22T17:47:46.647 回答
3

Ashared_ptr在这种情况下是理想的,但如果你真的不想使用那些你可以返回一个auto_ptr包含对象和 int 的对。

于 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

为什么不通过两个参考参数呢?

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