Smart resource manager

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Alan Johnson

    Smart resource manager

    I am trying to create an automatic resource manager that works very much
    the same as std::auto_ptr. However, I have a compile error I cannot
    figure out. The following program demonstrates the problem. Pretend,
    in each case, that -1 means "no resource", and any other number is a
    handle to a valid resource. The class releases the resource in the
    destructor (similar to a std::auto_ptr calling delete), so any time a
    copy of the class is made, ownership of the resource should be transferred.

    class A
    {
    int s ;
    public :
    A() : s(-1)
    { }

    A(int s) : s(s)
    { }

    A(A &a) : s(a.s)
    {
    a.s = -1 ;
    }

    ~A() throw()
    {
    // Do something to release resource.
    s = -1 ;
    }

    A &operator=(A &a) throw()
    {
    s = a.s ;
    a.s = -1 ;
    return *this ;
    }
    } ;

    A f()
    {
    A a(5) ;
    return a ;
    }

    int main()
    {
    A a ;
    a = f() ;
    return 0 ;
    }


    Compling gives the following problem:
    $ g++ -W -Wall -ansi -pedantic test.cpp
    test.cpp: In function `int main()':
    test.cpp:41: error: no match for 'operator=' in 'a = f()()'
    test.cpp:25: error: candidates are: A& A::operator=(A& )

    That is, the assignment fails, for some reason I cannot determine. Any
    insight would be appreciated.

    Thanks,
    Alan
  • Chris

    #2
    Re: Smart resource manager

    > A(int s) : s(s)

    dont use "s" as your paramter name, use something other then the name of
    your data member
    likely, this is your problem.

    -Chris


    Comment

    • Rolf Magnus

      #3
      Re: Smart resource manager

      Alan Johnson wrote:
      [color=blue]
      > I am trying to create an automatic resource manager that works very
      > much
      > the same as std::auto_ptr. However, I have a compile error I cannot
      > figure out. The following program demonstrates the problem. Pretend,
      > in each case, that -1 means "no resource", and any other number is a
      > handle to a valid resource. The class releases the resource in the
      > destructor (similar to a std::auto_ptr calling delete), so any time a
      > copy of the class is made, ownership of the resource should be
      > transferred.
      >
      > class A
      > {
      > int s ;
      > public :
      > A() : s(-1)
      > { }
      >
      > A(int s) : s(s)
      > { }
      >
      > A(A &a) : s(a.s)
      > {
      > a.s = -1 ;
      > }
      >
      > ~A() throw()
      > {
      > // Do something to release resource.
      > s = -1 ;
      > }
      >
      > A &operator=(A &a) throw()
      > {
      > s = a.s ;
      > a.s = -1 ;
      > return *this ;
      > }
      > } ;
      >
      > A f()
      > {
      > A a(5) ;
      > return a ;
      > }
      >
      > int main()
      > {
      > A a ;
      > a = f() ;
      > return 0 ;
      > }
      >
      >
      > Compling gives the following problem:
      > $ g++ -W -Wall -ansi -pedantic test.cpp
      > test.cpp: In function `int main()':
      > test.cpp:41: error: no match for 'operator=' in 'a = f()()'
      > test.cpp:25: error: candidates are: A& A::operator=(A& )
      >
      > That is, the assignment fails, for some reason I cannot determine.
      > Any insight would be appreciated.[/color]

      Your programm is not const-correct. f() returns a temporary, and in C++,
      you can't bind a non-const reference to a temporary. therefore, no
      suitable operator= is found. Since your operator= actually needs to
      modify the s member of the right hand side, you'd have to use the
      mutable keyword for your member. Try this:

      class A
      {
      mutable int s ;
      public :
      A() : s(-1)
      { }

      A(int s) : s(s)
      { }

      A(const A &a) : s(a.s)
      {
      a.s = -1 ;
      }

      ~A() throw()
      {
      // Do something to release resource.
      s = -1 ;
      }

      A &operator=(cons t A &a) throw()
      {
      s = a.s ;
      a.s = -1 ;
      return *this ;
      }
      } ;

      Comment

      Working...