[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c++

Problem about overload operator ++

Hill

10/5/2008 1:30:00 AM

This is a program just for testing operator overloading. But I found
the operator ++ doesn't act like on built-in types. For detail:
When
int array[10];
Ptr_to_T<int> smart_ptr(&array[0], array, 10);
*smart_ptr++ = 10; // I want to modify array[0],but this sentence
modifies array[1]

Do I make myself clear?
Could some body tell me how to fix it ?

#include <iostream>
using namespace std;
template<typename T>
class Ptr_to_T
{
public:
Ptr_to_T(T* p, T* array, int size):_p(p),_array(array),_size(size)
{}
Ptr_to_T(T* p):_p(p){}
Ptr_to_T& operator++(){//prefix
_p += 1;
return *this;
}
Ptr_to_T& operator++(int){//postfix
cout << "Entering Operator++" << endl;
T* temp = _p;
_p += 1;
return *this;
}
T& operator*(){
cout << "Entering Operator*" << endl;
return *_p;
}
private:
T* _p;
T* _array;
int _size;
};
int main()
{
int array[10];
Ptr_to_T<int> smart_ptr(&array[0], array, 10);
*smart_ptr++ = 10;
cout << array[0] << endl;
cout << array[1] << endl;
}


Result:

Entering Operator++
Entering Operator*
4246640
10



5 Answers

Ian Collins

10/5/2008 2:32:00 AM

0

Hill wrote:
> Ptr_to_T& operator++(int){//postfix
> cout << "Entering Operator++" << endl;
> T* temp = _p;
> _p += 1;
> return *this;
> }

Here you want to return a copy of the object before the increment, but
you are returning the object after the increment. temp does not serve
any purpose.

--
Ian Collins.

Kai-Uwe Bux

10/5/2008 3:22:00 AM

0

Hill wrote:

> This is a program just for testing operator overloading. But I found
> the operator ++ doesn't act like on built-in types. For detail:
> When
> int array[10];
> Ptr_to_T<int> smart_ptr(&array[0], array, 10);
> *smart_ptr++ = 10; // I want to modify array[0],but this sentence
> modifies array[1]
>
> Do I make myself clear?
> Could some body tell me how to fix it ?
>
> #include <iostream>
> using namespace std;
> template<typename T>
> class Ptr_to_T
> {
> public:
> Ptr_to_T(T* p, T* array, int size):_p(p),_array(array),_size(size)
> {}
> Ptr_to_T(T* p):_p(p){}
> Ptr_to_T& operator++(){//prefix
> _p += 1;
> return *this;
> }
> Ptr_to_T& operator++(int){//postfix
> cout << "Entering Operator++" << endl;
> T* temp = _p;
> _p += 1;
> return *this;

Did you mean:

Ptr_to_T temp ( _p, _array, _size );
_p += 1;
return temp;


> }
> T& operator*(){
> cout << "Entering Operator*" << endl;
> return *_p;
> }
> private:
> T* _p;
> T* _array;
> int _size;
> };
> int main()
> {
> int array[10];
> Ptr_to_T<int> smart_ptr(&array[0], array, 10);
> *smart_ptr++ = 10;
> cout << array[0] << endl;
> cout << array[1] << endl;
> }
>
>
> Result:
>
> Entering Operator++
> Entering Operator*
> 4246640
> 10

Obnoxious User

10/5/2008 7:37:00 AM

0

On Sat, 04 Oct 2008 18:29:54 -0700, Hill wrote:

> This is a program just for testing operator overloading. But I found the
> operator ++ doesn't act like on built-in types. For detail: When
> int array[10];
> Ptr_to_T<int> smart_ptr(&array[0], array, 10); *smart_ptr++ = 10; //
> I want to modify array[0],but this sentence
> modifies array[1]
>
> Do I make myself clear?
> Could some body tell me how to fix it ?

Did you even read the replies you got the last time?

--
OU
Remember 18th of June 2008, Democracy died that afternoon.
http://frapedia.se/wiki/Information_...

bashill.zhu@gmail.com

10/6/2008 12:59:00 AM

0

On 10?5?, ??3?37?, Obnoxious User <O...@127.0..0.1> wrote:
> On Sat, 04 Oct 2008 18:29:54 -0700, Hill wrote:
> > This is a program just for testing operator overloading. But I found the
> > operator ++ doesn't act like on built-in types. For detail: When
> > int array[10];
> > Ptr_to_T<int> smart_ptr(&array[0], array, 10); *smart_ptr++ = 10; //
> > I want to modify array[0],but this sentence
> > modifies array[1]
>
> > Do I make myself clear?
> > Could some body tell me how to fix it ?
>
> Did you even read the replies you got the last time?
>
> --
> OU
> Remember 18th of June 2008, Democracy died that afternoon.http://frapedia..se/wiki/Information_in_English

Thanks all!
template<typename T>
class Ptr_to_T
{
public:
class Range{};

Ptr_to_T(T* p, T* array, int size):_p(p),_array(array),_size(size)
{
}
Ptr_to_T(T* p):_p(p){}
Ptr_to_T& operator++(){//prefix
_p += 1;
return *this;
}
const Ptr_to_T operator++(int){//postfix
T* temp = _p;
_p += 1;
return Ptr_to_T(temp, temp, _array + _size - temp);
}
Ptr_to_T& operator--(){//prefix
_p--;
return *this;
}
const Ptr_to_T operator--(int){//postfix
T* temp = _p;
_p -= 1;
return Ptr_to_T(temp, temp, _array + _size -temp);
}
T& operator*(){
check();
return *_p;
}
private:
void check(){
if( _p - _array >= _size || _p < _array){
cout << _p - _array << endl;
throw Range();
}
}

T* _p;
T* _array;
int _size;
};

Kai-Uwe Bux

10/6/2008 1:16:00 AM

0

bashill.zhu@gmail.com wrote:

> On 10?5?, ??3?37?, Obnoxious User <O...@127.0.0.1> wrote:
>> On Sat, 04 Oct 2008 18:29:54 -0700, Hill wrote:
>> > This is a program just for testing operator overloading. But I found
>> > the
>> > operator ++ doesn't act like on built-in types. For detail: When
>> > int array[10];
>> > Ptr_to_T<int> smart_ptr(&array[0], array, 10); *smart_ptr++ = 10;
>> > // I want to modify array[0],but this sentence
>> > modifies array[1]
>>
>> > Do I make myself clear?
>> > Could some body tell me how to fix it ?
>>
>> Did you even read the replies you got the last time?
>>
>> --
>> OU
>> Remember 18th of June 2008, Democracy died that
>> afternoon.http://frapedia.se/wiki/Information_...
>
> Thanks all!
> template<typename T>
> class Ptr_to_T
> {
> public:
> class Range{};
>
> Ptr_to_T(T* p, T* array, int size):_p(p),_array(array),_size(size)
> {
> }
> Ptr_to_T(T* p):_p(p){}
> Ptr_to_T& operator++(){//prefix
> _p += 1;
> return *this;
> }
> const Ptr_to_T operator++(int){//postfix
> T* temp = _p;
> _p += 1;
> return Ptr_to_T(temp, temp, _array + _size - temp);

Huh?

Why is the returned value different from the old value? I would have
expected

return Ptr_to_T( temp, _array, _size );


> }
> Ptr_to_T& operator--(){//prefix
> _p--;
> return *this;
> }
> const Ptr_to_T operator--(int){//postfix
> T* temp = _p;
> _p -= 1;
> return Ptr_to_T(temp, temp, _array + _size -temp);

Same here.


> }
> T& operator*(){
> check();
> return *_p;
> }
> private:
> void check(){
> if( _p - _array >= _size || _p < _array){
> cout << _p - _array << endl;
> throw Range();
> }
> }
>
> T* _p;
> T* _array;
> int _size;
> };


Best

Kai-Uwe Bux