Connecting Tech Pros Worldwide Forums | Help | Site Map

Smart resource manager

Alan Johnson
Guest
 
Posts: n/a
#1: Jul 22 '05
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
Guest
 
Posts: n/a
#2: Jul 22 '05

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


Rolf Magnus
Guest
 
Posts: n/a
#3: Jul 22 '05

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