marvinm
asked on
iterator question
I have a program that compiles and runs fine under MS VS6, but gets compiler errors with .NET. I just wanted to know the difference between 2 statements.
I declare a vector
typedef vector<MyClass*>MyClassArr ay;
MyClassArray MyClassVar;
then an iterator
MyClassArray::iterator ppMyClass;
for (ppMyClass=MyClassVar.begi n(); ppMyClass!=MyClassVar.end( ); ppMyClass++) {
// .. do some things
return ppMyClass; // this works in vs6, but error in .net
}
.Net accepts
return &(*ppMyClass);
any insight would be appreciated
Thank You
I declare a vector
typedef vector<MyClass*>MyClassArr
MyClassArray MyClassVar;
then an iterator
MyClassArray::iterator ppMyClass;
for (ppMyClass=MyClassVar.begi
// .. do some things
return ppMyClass; // this works in vs6, but error in .net
}
.Net accepts
return &(*ppMyClass);
any insight would be appreciated
Thank You
It depends in your code, but a way of solving this is passing the array as a parameter to the function, so it will be available even after the function exits....
A way of solving this is......
MyClassArray::iterator function( MyClassArray & MyClassVar )
{
MyClassArray::iterator ppMyClass;
// Your code
return ppMyClass;
}
and you would call it like this
MyClassArray MyClassVar;
MyClassArray::iterator ppMyClass = function( MyClassVar );
A way of solving this is......
MyClassArray::iterator function( MyClassArray & MyClassVar )
{
MyClassArray::iterator ppMyClass;
// Your code
return ppMyClass;
}
and you would call it like this
MyClassArray MyClassVar;
MyClassArray::iterator ppMyClass = function( MyClassVar );
ASKER
that makes sense, but leads to my next question...
what should I be returning? What I am looking for is to get the address of the pointer to MyClassVar item in the vector, which is what I was treating the iterator value as.
Thank You
what should I be returning? What I am looking for is to get the address of the pointer to MyClassVar item in the vector, which is what I was treating the iterator value as.
Thank You
I'm not sure if you read my last post...........
You can return an iterator, but there are two ways of solving it
one way is to pass a reference to the array as a parameter (like I said)
another way would be to allocate the array in the heap
MyClassArray *MyClassVar = new MyClassArray();
and in this case you won't have problem in returning iterators to the array.....
(as the array is stored in the heap, it won't get destroyed when the function exits)........
Finally, I just wanted to add that if I were you I would choose the solution in the previous post, as you won't have problem in freeing the memory allocated with new (which you will have if you use this second possibility)
You can return an iterator, but there are two ways of solving it
one way is to pass a reference to the array as a parameter (like I said)
another way would be to allocate the array in the heap
MyClassArray *MyClassVar = new MyClassArray();
and in this case you won't have problem in returning iterators to the array.....
(as the array is stored in the heap, it won't get destroyed when the function exits)........
Finally, I just wanted to add that if I were you I would choose the solution in the previous post, as you won't have problem in freeing the memory allocated with new (which you will have if you use this second possibility)
ASKER
sorry, I posted my followup before refreshing the browser window. I will look into
doing this with our complete app and either post followup questions or grade your response.
Thank You
doing this with our complete app and either post followup questions or grade your response.
Thank You
Ok, just let me know marvinm
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
see ur STL of vs6 and .net they are different STL library i guess...
ASKER
tinchos, thank you for your help as well.
rstaveley's comment pointed me more in the correct direction though.
Thank You
rstaveley's comment pointed me more in the correct direction though.
Thank You
Ok marvinm, glad you could solve your problem
This is like returning a pointer to a local array (An iterator could be considered as a pointer to an element of the vector).
when you make
void function()
{
MyClassArray MyClassVar;
MyClassArray::iterator ppMyClass;
}
The myClssVar is a local variable, so it is stored in the stack...........
when the function exits, all the stack is released.....
so, if you return an iterator (or let's say a pointer), you're referencing memory that after the function exits, is not going to be available
This is why I believe that .net is giving an error. (I believe that MsVC6 didn't take this as an error).
Hope it's clear enough
Tincho