Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Returning a new object along with another value

Tags:

c++

auto-ptr

I want to return two values, one of which is a new object. I can do this using std::pair:

class A {
//...
};

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

To make the code exception-safe, I would like to do:

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

But this won't compile as the auto_ptr cannot be copied without modifying the auto_ptr being copied. Ok, this means auto_ptr does not compose well like other types (in one more way). What is a good way of returning a new object in this case?

One alternative is to return a shared_ptr and another is an inout reference. But I am looking for some other alternative. I can do something like:

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

Is there a better way?

like image 899
amit kumar Avatar asked Jun 22 '09 17:06

amit kumar


People also ask

Can a method return multiple things?

You can return only one value in Java. If needed you can return multiple values using array or an object.

Can we have 2 return types in Java?

Your answerNo, you don't have two return types.

How do I return two objects from a function?

To return multiple values from a function, you can pack the return values as elements of an array or as properties of an object.


2 Answers

There are two major ways to handle this problem:

  1. Do the cleanup yourself, via try/catch.
  2. Use some kind of automated memory management, like shared_ptr.

auto_ptr doesn't really work in these sorts of cases, as you discovered, but the new standard and Boost both contain reference-counted pointers that do what you want. Let us know what you don't like about shared_ptr, and maybe we can suggest an alternative.

like image 175
David Seiler Avatar answered Sep 20 '22 20:09

David Seiler


A shared_ptr would be ideal in that situation, but if you really don't want to use those you could return an auto_ptr to a pair containing the object and the int instead.

like image 23
Gab Royer Avatar answered Sep 22 '22 20:09

Gab Royer