返回一个新对象和另一个值

ami*_*mit 5 c++ auto-ptr

我想返回两个值,其中一个是一个新对象.我可以这样做std::pair:

class A {
//...
};

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

为了使代码异常安全,我想做:

std::pair<std::auto_ptr<A>, int> getA()
{
    std::auto_ptr<A> a(new A); 
    //...
} 
Run Code Online (Sandbox Code Playgroud)

但是这不会编译,因为在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_;
};
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Dav*_*ler 5

有两种主要方法可以解决此问题:

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

auto_ptr正如你所发现的那样,在这些类型的情况下并没有真正起作用,但新标准和Boost都包含了你想要的引用计数指针.让我们知道你不喜欢什么shared_ptr,也许我们可以建议一个替代方案.


Tim*_*imW 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);  
}
Run Code Online (Sandbox Code Playgroud)