Questions sur la POO dans MQL5 - page 74

 
Vladimir Simakov:

Il n'y a pas de pointeur ici). Il y a un handle pour la classe, et travailler avec lui est similaire à travailler avec un pointeur, mais c'est là que le point commun s'arrête.

Mon esprit inquisiteur et mes mains coquines m'ont occupé pendant deux jours et deux nuits.

j'ai essayé de supprimer l'objet créé dynamiquement hors de la portée - dans la fonction, la méthode de tâtonnement, mais finalement j'ai obtenu la solution :

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* &t)
{
   delete t;
}

qui le supprime, mais je n'arrive pas à le comprendre comme ceci : ..... et je n'ai pas trouvé de signatures de fonctions similaires pour passer les pointeurs


Voici une autre question :

comment puis-je retourner un pointeur vers un objet par référence comme résultat d'une fonction ?

Je veux faire quelque chose comme ça :

CTest ret_CTest()
{
   CTest *result = new CTest;
   return(result);
}


il est possible de retournerCTest * sans problèmes, mais comme j'ai écrit ret_CTest() - il donne une erreur

 
Igor Makanu:

Deux jours et deux nuits, mon esprit curieux et mes mains coquines m'ont occupée.

j'ai essayé de supprimer l'objet créé dynamiquement hors de la portée - dans la fonction, méthode de l'intuition, mais j'ai finalement trouvé la solution :

qui le supprime, mais je n'arrive pas à le comprendre comme ceci : ..... et je n'ai pas pu trouver de signatures de fonctions similaires pour le passage de pointeurs dans l'aide ou le sat

Que voulez-vous dire par "hors champ" ? Vous l'avez passé dans une fonction, donc il y est visible).

s.s.void deleteCTest(CTest* &t) sans ce & devrait fonctionner aussi, non ?

Pour le supprimer réellement en dehors du périmètre où il a été créé, et éventuellement de manière automatique, il faut ... shh... avant que quelqu'un n'entende... Pattern Factory... lire plus vite et supprimer...

 

Igor Makanu:


mais comment retourner un pointeur sur un objet par référence comme résultat d'une fonction ?

vous pouvez retournerCTest * sans problèmes, mais comme j'ai écrit ret_CTest() - il donne une erreur
Si vous voulez du casher
CTest& Foo();
, pas encore, mais si c'est le cas :
CTest Foo();

Si une classe a un constructeur de copie, alors elle doit avoir un constructeur de copie.

CTest(CTest &other)...
 
Aleksey Mavrin:

s.w.void deleteCTest(CTest* &t) sans ceci & devrait fonctionner aussi, ou non ?

allez voir, vous apprendrez quelque chose de nouveau ;)

J'ai écrit à plusieurs reprises que les pointeurs MQL sont très instructifs. ))))


Vladimir Simakov:
Si vous voulez du casher, pas encore, mais si oui :

Si vous voulez utiliser un pointeur, la classe doit avoir un constructeur de copie.

Encore une fois, j'ai besoin de réfléchir

J'ai le sentiment que GetPointer() peut faire quelques tours... mais ce n'est pas un fait.... Ces "sauts dans l'espace et le temps" - via les pointeurs et le déréférencement implicite dans MQL - me dépassent ! (((

 
Igor Makanu:

allez voir, vous apprendrez beaucoup ;)

J'ai écrit à plusieurs reprises que les pointeurs dans MQL sont une chose très instructive )))).

Il supprime les pointeurs mais il ne peut pas attribuer une nouvelle valeur à _test. D'ailleurs, MQL n'a rien à voir avec cela))))

 
Igor Makanu:

allez voir, vous apprendrez beaucoup ;)

Je vous ai dit et répété que les pointeurs dans MQL sont très instructifs )))).


Encore une fois, j'ai besoin de réfléchir

J'ai le sentiment que GetPointer() peut faire quelques tours... mais ce n'est pas un fait.... Ces "sauts dans l'espace et le temps" - via les pointeurs et le déréférencement implicite dans MQL - me dépassent ! (((

C'est bon ici)))) Il suffit de désactiver l'effet de netteté, il n'y en a même pas un soupçon ici)))).

 
Igor Makanu:

allez voir, vous apprendrez beaucoup ;)

Je vous ai dit et répété que les pointeurs dans MQL sont très instructifs )))).

Je l'ai vérifié. Il supprime bien sans &)

Je l'ai essayé dans MT4 et MT5 et je l'ai comparé).

class CTest
{
public:
   CTest() { Print(__FUNCTION__); }
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest();
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* t)
{
   delete t;
}
 
Aleksey Mavrin:

Bien vérifié. Il supprime parfaitement sans &)

Je l'ai essayé dans MT4 et MT5 et je l'ai comparé).

Ce n'est pas un exemple complet, mais je l'ai rencontré aujourd'hui.

Il ne fonctionnera pas sans & .

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
   delete _test;
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* & t)
{
   delete t;
   t = new CTest;
}
//+------------------------------------------------------------------+

Vladimir Simakov:

Je suis bien ici)))) Je ne cherche pas de piques, mais je suis sûr que cela fonctionnera sans &)).


Je ne cherche pas Sharp, je suis encore aux prises avec MQL, je peux demander ce que je ne comprends pas.

 
Igor Makanu:

pas un exemple complet, je suis tombé dessus aujourd'hui.

ça ne fonctionnera pas comme ça sans &

Bien sûr que oui. Vous passez un pointeur par valeur, donc une copie du pointeur sera créée. Vous allez l'utiliser pour clouer l'objet, et créer un nouvel objet pour le pointeur qui a été créé dans la fonction. C'est du c++, bienvenue))))
 
Igor Makanu:

exemple non exhaustif, trouvé aujourd'hui

il ne fonctionnera pas sans &



À mon avis, cela n'a rien à voir avec les références, mais seulement avec le fait que l'argument de la fonction doit être passé par un pointeur si vous voulez qu'il enregistre la valeur après l'exécution de la fonction. La même chose se produira avec un handle de fichier ou d'indicateur, par exemple, qui ne sont pas des références.

Cela a toujours été la norme en C++, même si cela fait longtemps que je ne m'en souviens plus.

Raison: