MQL5 Le compilateur ne fait pas la distinction entre une classe et un pointeur vers celle-ci - page 7

 
Alexey Navoykov:
Vous proposez donc d'interdire complètement le nommage implicite des pointeurs ? Je ne pense pas que beaucoup de personnes ici seraient ravies de cela.

Que chacun ait le choix.

#property strict

Je ne veux certainement pas de ce genre de tour.

 
SemenTalonov:

Cela va sans dire. Il y a une fuite de mémoire.

Une fuite de mémoire, vous dites ? Que pensez-vous de ça ? )))

#property strict

class A
 {
  A*  item;
  int num;
public:
  A(int p=10){num=p;item=NULL;} ~A(){if(CheckPointer(item)==POINTER_DYNAMIC) delete item;}
  A* operator=(A* par){ item = par; return&this; }
  A* operator~(){ return item; }
  int operator-(){ return num; }
 };

void OnStart()
 {
  A a = new A(20);
  printf("В автообъекте %i (%i) сохранен динамический объект %i (%i), который он в конце своего цикла сам уничтожает...",&a,-a,~a,-~a);
 }


 
Ilya Malev:

Une fuite de mémoire, vous dites ? Que pensez-vous de ça ? )))


delete item;

Cela suppose donc que le sujet est prêt à être traité de cette façon. Combien d'entre eux prévoient cette possibilité ?

 
SemenTalonov:

Cela suppose donc que l'objet est prêt à être traité de cette manière. Beaucoup de personnes prévoient-elles une telle éventualité ?

Je pense que si quelqu'un écrit le mot new, il doit savoir exactement où se trouve le mot delete correspondant ailleurs dans son code.

 
Cette construction, d'ailleurs, si elle est un peu raffinée, s'appelle un "collecteur de déchets"))).
 
SemenTalonov:

Que chacun ait le choix.

Je n'ai certainement pas besoin de telles astuces.

Je l'utilise déjà dans MQL4. Comment cela fonctionnera-t-il alors, si la syntaxe du langage est la même ?

Eh bien, pour se protéger contre de telles actions, on peut créer une méthode privée dans une classe :

class A
{
 private: void operator=(const A*);
}

Bien que, franchement, je ne vois pas de problème ici. Si vous assignez quelque chose à un objet de classe, vous vous attendez a priori à ce que l'opérateur de copie soit appelé. Vous le voulez, vous l'obtenez. Quelle différence cela fait-il s'il s'agit d'un pointeur ou d'un objet ? Le type de classe est le même. Vous ne pouvez pas attribuer de classe à un gaucher. C'est pourquoi tout cela ressemble plus à un alésage à vide.

Dans le cas contraire, avec le pointeur à gauche, c'est une autre histoire : on aurait pu s'attendre à ce que le pointeur soit assigné à quelque chose, mais il s'agit en fait de la copie d'un objet.

 
Alexey Navoykov:

Le cas opposé, avec le pointeur à gauche, est différent. Là, on pourrait s'attendre à assigner quelque chose au pointeur, mais il s'avère que vous copiez un objet.

Et vous ne pouvez pas l'interdire, sinon vous ne pourrez pas copier l'objet lorsque vous en aurez vraiment besoin.

Par conséquent, vous devez tout laisser en l'état. Soyez juste conscient de ce que vous faites.

 
fxsaber:

Et vous ne pouvez pas l'interdire, sinon vous ne pourrez pas copier l'objet lorsque vous en aurez vraiment besoin.

En fin de compte, il faut laisser les choses comme elles sont. Soyez juste conscient de ce que vous faites.

О ! C'est l'essentiel.

Y a-t-il beaucoup de personnes ici qui savent naviguer dans les modes de gestion de la mémoire ? Comprendre la différence entre AUTOMATIQUE et DYNAMIQUE.

Et j'ai entendu parler de STATIQUE et de BASE (bien que cela ne soit pas nécessaire).

 
fxsaber:

Et vous ne pouvez pas l'interdire, sinon vous ne pourrez pas copier l'objet lorsque vous en aurez vraiment besoin.

En fin de compte, il faut laisser les choses comme elles sont. Soyez juste conscient de ce que vous faites.

Il existe des opérateurs * et & pour convertir en ce dont vous avez besoin.
 
Alexey Navoykov:
Il existe des opérateurs * et & pour le réduire à ce qui est nécessaire.

Où y a-t-il un *?

Raison: