Problem about overload operator ++

H

Hill

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
 
I

Ian Collins

Hill said:
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.
 
K

Kai-Uwe Bux

Hill said:
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
 
B

bashill.zhu

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?

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;
};
 
K

Kai-Uwe Bux

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?

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
 

Ask a Question

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.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,955
Messages
2,570,117
Members
46,705
Latest member
v_darius

Latest Threads

Top