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

 
SemenTalonov:

C'est ce que j'attendais de la copie... Le constructeur de copie par défaut n'est pas une erreur.

MaisDmitry dit qu'un nouvel objet sera alloué en mémoire et qu'un pointeur de typePOINTER_AUTOMATIC sera renvoyé.

Chacun comprend les bizarreries de MQL à sa manière).

Yep. Il s'avère qu'il n'y a pas de Père Noël.

Je n'ai pas écrit sur un objet en mémoire.

D'accord, il y avait autrefois des disputes sur la façon de distinguer une référence d'un pointeur. Mais maintenant il semble que nous ne pouvons pas distinguer un objet d'un pointeur.

 
Dmitry Fedoseev:

D'où vient la copie d'un objet ? Une copie d'un pointeur, oui, mais pointant vers le même objet.

Nous avons un tableau d'objets. Un opérateur d'affectation est appelé sur le premier élément de ce tableau, qui est passé à l'objet créé séparément (bien que l'opérateur ne soit pas déclaré). Que pensez-vous qu'il devrait y avoir dans le premier élément du tableau après cela ? A mon avis, l'objet doit rester.

 
SemenTalonov:

Ce que je veux dire, c'est qu'un constructeur de copie explicitement déclaré ne changerait rien à ce test.

Comment pouvez-vous ne pas voir l'évidence...

Un élément de tableau d' objets contient un pointeur et un objet dans l'élément de tableau de pointeurs... est-ce vraiment normal ?

Dans le premier cas, un pointeur d'objet va dans le tableau ; dans le second cas, le constructeur de copie devrait fonctionner, comment ces opérations peuvent-elles être équivalentes ?

Pas le constructeur de copie, mais l'opérateur d'affectation, mais ce sont les petites choses.

C'est l'objet qui doit être placé dans un élément d'un tableau d'objets.

Dans le premier cas - vous avez exactement un tableau d'objets, quel genre de "pointeurs" ?

 
Georgiy Merts:

Nous avons un tableau d'objets. L'opérateur d'affectation est appelé au premier élément de ce tableau et l'objet créé séparément lui est passé. A votre avis, que devrait être le premier élément de ce tableau après cela ? A mon avis, l'objet doit rester.

А... Ce n'est pas bon du tout là-bas)))) Tableau de pointeurs automatiques, et dans celui-ci se trouve également l'objet créé dynamiquement. Ensuite, il y a 3 objets, deux d'entre eux seront automatiquement supprimés et un fuira. S'il est compilé.

 

Ça devrait être comme ça :

A* m_A[2];

et ainsi de suite :

m_A[0] =GetPointer(a); 
 

Et à la fin, ça se passe comme ça :

for(int i=0;i<2;i++)if(CheckPointer(m_A[i])==POINTER_DINAMIC)delete(m_A[i]); 
 
Dmitry Fedoseev:

А... Ce n'est pas bon du tout là-bas)))) Un tableau de pointeurs automatiques, et on y trouve aussi un objet créé dynamiquement.

Enfin !))

Georgiy Merts:

C'est l'objet qui doit être placé dans l'élément du tableau d'objets.

Dans le premier cas - vous avez exactement un tableau d'objets, quels "pointeurs" ?

C'est ce que je veux dire ! Pourquoi ça marche ? !

m_A[1] = new A();
 
SemenTalonov:

Enfin !))

C'est ce que je veux dire ! Pourquoi ça marche ? !

Si A est déclaré tel :

A* m_A[2]; 

Alors, c'est bon.

Et si c'est comme ça :

A m_A[2]; 

Il ne devrait pas compiler. Soit il y a un bug dans le compilateur, soit le compilateur ne doit pas penser pour tout le monde.

 
Ce n'est probablement pas un bogue, mais l'affectation d'objets simples devrait fonctionner, vous devez donc prendre soin de supprimer l'objet que vous avez créé avec new.
 
Dmitry Fedoseev:

Alors il ne devrait pas compiler. Soit il y a un bug dans le compilateur, soit le compilateur ne doit pas penser pour tout le monde.

Bingo !

SemenTalonov2019.01.10 07:36POINTER_AUTOMATIC vers un pointeur du typePOINTER_DYNAMIC et vice versa.