Re: constructor and reset method
* jason.cipriani@gmail.com:
"Alf P. Steinbach" <alfps@start.no> wrote in message news:
13sa67q3k67103d@corp.supernews.com...
Check out the swap idiom for implementing assignment operator in terms of copy
constructor.
Is that something like this (from http://www.gotw.ca/gotw/059.htm):
T& T::operator=( const T& other )
{
T temp( other ); // do all the work off to the side
Swap( temp ); // then "commit" the work using
return *this; // nonthrowing operations only
}
Yes, except you can do it neater:
T& operator=( T other )
{
swap( other );
return *this;
}
And one advantage is there's really not much to do in the = operator,
since you are using the constructors to do a lot the work?
Main advantages are exception safety and avoiding redundant code (always a
source of bugs and extra work).
So a
Reset() might simply be:
void T::Reset () {
Swap(T());
}
Well no, it would have to be
void reset() { T().swap( *this ); }
But in that case... I mean, is there a way to implement Swap() that
doesn't involve explicitly typing out code to swap all of the members?
Since you just need to do a "shallow" swap... is something like this
reliable:
void T::Swap (T &other) {
char temp[sizeof(T)];
memcpy(temp, &other, sizeof(T));
memcpy(&other, *this, sizeof(T));
memcpy(*this, temp, sizeof(T));
}
It all depends. Some member might have a pointer back to the object, say.
However, there is a nice little elegant facility for iterating through members
in a little side project of Boost.Spirit, I forget the name (Poenix?), and
possibly that might serve as foundation for a general implementation?
That seems like a horrible way to do it...
memcpy, yes, horrible.
also, what if "other" is something derived from T?
The swap idiom takes care of that, whereas other idioms may not necessarily take
care of that.
Is there a way to just use the compilers
default assignment operator even when you've defined your own?
Depends which assignment operator you have defined. :-) But if you have defined
the copy assignment operator, then no. On the other hand, the compiler will use
your copy assignment operator when it defines one for a derived class.
Or does
it always make sense to use the "pimpl" idiom when implementing a swap
function, so that you don't have to do something like that?
I don't see what the PIMPL idiom has to do with this, but possibly you mean
having a pointer to the real object state so that you only need to swap
pointers. Well that's what std::vector etc. has. And they also have swap
member functions, so, very efficient.
Cheers, & hth.,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?