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

时间:2009-06-22 17:41:38

标签: c++ auto-ptr

我想返回两个值,其中一个是新对象。我可以使用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不像其他类型那样构成(再一次)。在这种情况下返回新对象的好方法是什么?

另一种方法是返回shared_ptr,另一种方法是输入参考。但我正在寻找其他替代方案。我可以这样做:

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_;
};

有更好的方法吗?

5 个答案:

答案 0 :(得分:5)

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

  1. 通过try / catch自行清理。
  2. 使用某种自动内存管理,例如shared_ptr
  3. 正如您所发现的那样,

    auto_ptr在这些情况下并不真正起作用,但新标准和Boost都包含符合您要求的引用计数指针。让我们知道您对shared_ptr不喜欢什么,也许我们可以提出另一种选择。

答案 1 :(得分:3)

shared_ptr在这种情况下是理想的,但是如果你真的不想使用它们,你可以将auto_ptr返回给包含对象和int的对。

答案 2 :(得分: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);  
}

答案 3 :(得分:1)

它不漂亮,但你可以通过指针或引用参数返回另一个值:

int i;
std::auto_ptr<A> a = getA(&i);

答案 4 :(得分:1)

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

class AGetter
{
    // ..
    void get(std::auto_ptr<A>& a, int& i)
    {
         a = a_.release();
         i = i_;
    }
    // ..
};