M
maths_fan
Can't understand how to overload these operations and for what reason?
maths_fan said:Can't understand how to overload these operations and for what reason?
maths_fan said:Can't understand how to overload these operations and for what reason?
Nick said:1.
struct X
{
Y* operator->();
}
2. (the not obvious bit)
Because the compiler will reapply -> to the result.
This allows smart pointers, lazy construction, locking and much more.
I've had some problems with this in the past.
My compiler was Codewarrior, and the fix was to do
(*myIterator)->MethodCall();
This was with not-std:: containers, but is this basically telling
me that I *should* be able to have a container of pointers to
objects, and do iterator->call() and have it bounce through
operator->() implementations 'til it gets to the end? Are there
any gotchas that I may not have been aware of that would prevent
this from happening correctly?
Rob said:struct X
{
int x;
};
int main()
{
X x;
std::vector< X * > xpv( 10, &x );
std::vector< X * >::iterator ptr = xpv.begin();
}
Then ptr.operator -> () will return an X**, not an X*.
If you try ptr->x, the compiler will call ptr.operator -> () and
then try to apply the inbult (X**)->x, however there is no such
operator, inbult opertor -> *only* applies to pointers to struct's (*)
and X** is a pointer to a pointer not a pointer to a struct.
*) by 'struct' I mean aggragate i.e, struct, class or union.
So the Gotcha would be "there is no inbuilt operator -> for T**".
Rob Williscroft wrote:
[snip]So the Gotcha would be "there is no inbuilt operator -> for T**".
So this is to say if I had:
std::vector< boost::shared_ptr<X> >::iterator it;
it->x = 3;
would compile properly?
I think I get it. I was reading previous information on this
topic to suggest that there *was* a built-in operator-> that was
triggered that would "do what you expect," although now that I
think about it it seems obviously wrong since you wouldn't (?)
want:
X** x;
x->x = 5;
to compile.
Rob said:Alas it doesen't, it.operator ->() returns a boost::shared_ptr<X> *.
Oh...
I fail to see now, then, where this operator-> does this bouncing
then... When does it, when can it, come up?
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.