Connecting Tech Pros Worldwide Help | Site Map

Smart resource manager

  #1  
Old July 22nd, 2005, 12:25 PM
Alan Johnson
Guest
 
Posts: n/a
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
  #2  
Old July 22nd, 2005, 12:26 PM
Chris
Guest
 
Posts: n/a

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


  #3  
Old July 22nd, 2005, 12:26 PM
Rolf Magnus
Guest
 
Posts: n/a

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=(const A &a) throw()
{
s = a.s ;
a.s = -1 ;
return *this ;
}
} ;

Closed Thread


Similar Threads
Thread Thread Starter Forum Replies Last Post
Smart Card Resource Manger =?Utf-8?B?QWlyYm9ybmU4Mg==?= answers 0 November 23rd, 2007 06:15 PM
A question about smart pointer Yong Hu answers 16 July 2nd, 2006 03:15 PM
Constness of the container of shared_ptr and the constness of it elements PengYu.UT@gmail.com answers 14 April 4th, 2006 03:07 AM
Yet Another Question About Smart Pointers (YAQAS) Johnny Hansen answers 6 July 22nd, 2005 08:56 PM