C ++ operator [] overload problem (works fine, but not for pointers, why?)

The problem with the [] operator in C ++, I have some class:

197 class Permutation{
198         private:
199                 unsigned int* array;
200                 unsigned int size;
201
202                 void fill(){
203                         for(unsigned int i=0;i<size;i++)
204                                 array[i]=i;
205                 }
206                 void init(const unsigned int s){
207                         if(s){
208                                 array=new unsigned int[s];
209                                 size=s;
210                         }else{
211                                 size=0;
212                                 array=0;
213                         }
214                 }
215                 void clear(){
216                         if(array){
217                                 delete[]array;
218                                 array=0;
219                         }
220                         size=0;
221                 }
222         public:
223                 Permutation(const unsigned int& s=0):array(0),size(0){
224                         init(s);
225                         fill();
226                 }
227                 ~Permutation(){
228                         clear();
229                 }
230                 unsigned int& operator[](const unsigned int& idx){
231                         assert(idx<size);
232                         return array[idx];
233                 }
234                 unsigned int& get(const unsigned int& idx)
235                 {
236                         assert(idx<size);
237                         return array[idx];
238                 }


253                 Permutation& operator=(const Permutation& p){
254                         clear();
255                         init(p.size);
256                         size=p.size;
257                         for(unsigned int i=0;i<size;i++)
258                                 array[i]=p.array[i];
259                         return *this;
260                 }
261
262                 Permutation(const Permutation&p)
263                 {
264                         clear();
265                         init(p.size);
266                         size=p.size;
267                         for(unsigned int i=0;i<size;i++)
268                                 array[i]=p.array[i];
269                 }
};

when i use

Permutation x(3);
x[0]=1;

It works very well, but when I use:

Permutation* x=new Permutation(3);
x->get(0)=10; // this works fine
x[0]=1;

in this case, in the debugger, I see that it is called the constructor of a new object for the Permutation class, what happens? and why? Someone I know is happening. I would appreciate information.

+3
source share
3 answers

First, your code:

Permutation* x=new Permutation(3);
x->get(0)=10; // this works fine

And then you do it:

x[0]=1;

And what you do is treat the x pointer as an array and initialize it, for which:

x[0] = Permuation(1);  // implicit conversion using Permulation(const unsigned long&)

What you wanted to write was:

(*x)[0]=1;  // follow x and then invoke the [] operator

Or, equivalently:

x->operator[](0) = 1;
+6
source

x[0] *(x+0), *x. , Permutation.

1, Permutation(const unsigned int&). Permutation, *x, .

+2

, . :

Permutation &rx = *x;
rx[0] = 1;  // same as (*x)[0] = 1;

, . , .

0

Source: https://habr.com/ru/post/1731794/


All Articles