Connecting Tech Pros Worldwide Help | Site Map

Smart resource manager

 
LinkBack Thread Tools Search this Thread
  #1  
Old July 22nd, 2005, 11:25 AM
Alan Johnson
Guest
 
Posts: n/a
Default 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

  #2  
Old July 22nd, 2005, 11:26 AM
Chris
Guest
 
Posts: n/a
Default 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, 11:26 AM
Rolf Magnus
Guest
 
Posts: n/a
Default 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 ;
}
} ;

 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,662 network members.