Smart resource manager

A

Alan Johnson

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::eek:perator=(A&)

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

Thanks,
Alan
 
C

Chris

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
 
R

Rolf Magnus

Alan said:
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::eek:perator=(A&)

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

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

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top