fabian.lim
9/10/2008 9:44:00 AM
Hi James,
Thanks for replying my post again. I am doing the proxy thing, that
is done by the VectorItr Class. Essentially my code works only in the
following situation:
template <typename TYPE>
void ModifyValues(const Vector<TYPE>& x){
Vector<int> y;
//put in some values into y.. lets say {3,4}
y = x(0,1);
}
int main (){
Vector<int> x;
//put in some values into x.. lets say { 0, 1, 2}
//try to index 2 values of x and change y
return 0;
}
In this situation, Vector x is passed into the function ModifyValues()
as a const, thus the const overloaded () operator will kick in.
However, in the following situation, it will not work:
int main (){
Vector<int> x,y;
//put in some values into x.. lets say { 0, 1, 2}
//put in some values into y.. lets say {3,4}
//try to index 2 values of x and change y
y = x(0,1); <---- doesnt work, will call the non-const version
of the operator() overload
x(0,1) = y; <------ however this works.
return 0;
}
If I do not pass Vector x into a function, and specify it to be const,
the const overload never kicks in.
Thanks
On Sep 9, 11:19 pm, James Kanze <james.ka...@gmail.com> wrote:
> On Sep 10, 8:35 am, fabian....@gmail.com wrote:
>
> > Im having a problem with my code. Im programming a vector
> > class, and am trying to overload the () operator in 2
> > different situations. The first situation is to assign
> > values, e.g. Y = X(1,2), the elements 1 and 2 of X gets
> > assigned to Y. In this case, the operator () overload should
> > create a copy that is unmodifiable. In the 2nd case, I want do
> > assign values to elements 1 and 2, e.g. X(1,2) = Y. Then in
> > this case, the values must be updated. I update by
> > instantiating a custom iterator class which has an overloaded
> > = operator. Below is my code. Sorry its a little long.
> > The issue now is that when I do Y = X(1,2), I always end up
> > calling the overload that is meant for the 2nd situation,
> > rather than the first. I hope I can get some advice.
>
> I've not plunged into your code, but the standard solution here
> is for the operator() to return a proxy. (I did something like
> this in my pre-standard string class, which allowed:
> s( n, m ) = ... ;
> for
> s = s.replace( n, m, ... ) ;
> .) Basically, you still need two operator(): one const (in
> order to be able to call it on a const object), and one
> non-const. The const one can return the sub-vector directly,
> but the non-const one must return a proxy. Basically, the proxy
> just stores the relevant information, and overloads its
> operator= so that it actually does the expected assign.
> Something like:
>
> class Proxy // should be a member of Vector
> {
> public:
> Proxy( Vector& v, int i, int j )
> : owner( &v ), i( i ), j( j )
> {
> }
>
> // For conversion to rvalue...
> operator Vector() const
> {
> return Vector( *owner, i, j ) ;
> }
>
> // For v1 = v2( i, j ) ;
> Vector& operator=( Vector const& other )
> {
> owner->v.erase( v.begin() + i, v.begin() + j ) ;
> owner->v.insert( v.begin() + i, other.begin(),
> other.end() ) ;
> return *owner ;
> }
> } ;
>
> Or something along those lines.
>
> --
> James Kanze (GABI Software) email:james.ka...@gmail.com
> Conseils en informatique orientée objet/
> Beratung in objektorientierter Datenverarbeitung
> 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34