Re: Classes with reference members in a vector.
sidney@jigsaw.nl wrote:
Vikram wrote:
I imagine that both copy() and sort() can be written in terms of
copy-constructors rather than operator=.
- Especially sorting requires swapping. This requires assignment.
- Copying, especially when having two established ranges, require
assignment, else explicitly calling destructor and inplace construction
would be required - what if inplace construction through exception?
Then the container would be left in an unusable state. Impossible to
write exception safe (value semantics) container if assignment not
allowed (my guess).
Anyway, I will have to deal with it. No reference members in classes
that go into STL containers.... It just makes some classes rather less
clean than they could be, for no apparent reason (to me at least). At
least when I would like to put them in STL containers.
You have many options - why not use pointers, or boost::shared_ptr - it
is copyable and assignable and can be used in containers.
Having to declare class members as pointers rather than references
because the STL containers are unable to handle them properly makes me
a bit uncomfortable I must say.
I would not use reference members in the first place. They give you a
false sense of security. If you want to share objects, use something
like boost::shared_ptr.
One last thing, if you really want to use references in your containers
(no reason to, apart from proving you can) - have a look at boost::ref
library. This is probably not its (initial) intent though.
Code would look something like this. I only checked that it compiled -
requires the boost library of course, but you could easily write your
own ref wrapper...
#include <boost/ref.hpp>
#include <vector>
#include <iostream>
int main()
{
typedef boost::reference_wrapper<int> irefWrapper;
typedef std::vector<irefWrapper> ref_vect;
int v1( 0 );
int v2( 1 );
int& r1( v1 );
int& r2( v2 );
ref_vect rvect;
rvect.push_back( irefWrapper( r1 ) );
rvect.push_back( irefWrapper( r2 ) );
std::copy( rvect.begin(), rvect.end(),
std::ostream_iterator<int>(std::cout, " Missipi \n") );
std::cin.get();
return 0;
}
Regards,
Werner