Questions sur la POO dans MQL5 - page 43

 
Igor Makanu:

SZS : Vos messages sont presque toujours raisonnables, mais la présentation du matériel, eh bien, pas exactement avec de bonnes intentions, bien sûr votre entreprise, mais imho, vous voulez aider - aider, veulent être intelligents, eh bien, il s'avère souvent de cette façon.

Le pitch vous fait penser... vous avez écrit que vous avez commencé à penser au code, et avant vous codiez au pied levé...

 
A100:

Le pitch vous fait penser... vous avez écrit que vous avez commencé à penser au code, et avant cela vous codiez dans l'urgence.

hmm... Eh bien, je n'ai jamais écrit un doddle ! - c'est un fait !

SZZY : Je mets à jour le sujet périodiquement, non pas par ignorance ou parce que je ne peux pas trouver le matériel moi-même, mais parce qu'il y a un actif, qui m'intéresse ;)

ZSYS : le résultat de la communication - plutôt repensé pourquoi utiliser des modificateurs, pourquoi nous avons besoin d'un get/set - cela permet de gagner du temps sur la phase de développement, avec l'utilisation habile du compilateur, le test du code écrit sera immédiatement réussi - ici vraiment ouvert les yeux, qui était un atout dans le sujet, encore une fois, merci !

 
Koldun Zloy:

Voici un exemple :

D'après votre code, l'utilité de l'interface n'est pas claire, c'est pourquoi je l'ai supprimée.

Bien sûr, je ne connais pas complètement votre tâche, mais il y a 99,99 % de chances que ce ne soit pas nécessaire.

Mauvais...

 
Igor Makanu:

Hum... Je n'ai jamais écrit dans un flou ! - c'est un fait !

SZZY : Je mets périodiquement à jour ce sujet, non pas par ignorance, ou parce que je ne peux pas trouver de matériel par moi-même, mais parce qu'il y a un actif, dont l'opinion m'intéresse ;)

SZZY : le résultat de la communication - plutôt repensé pourquoi utiliser des modificateurs, pourquoi nous avons besoin d'un get/set - cela permet de gagner du temps au stade du développement, avec une utilisation habile du compilateur, le test du code écrit sera immédiatement réussi - ici vraiment ouvert les yeux, qui a été un atout dans le sujet, encore une fois, merci !

C'est très bien que tu aies appris quelque chose. Mais vous pouvez faire beaucoup plus de progrès si vous lisez le C++ de Stroustrup.

Mais il vaut mieux ne pas lire les articles et les diverses vidéos sur Habra. Tout le monde peut y écrire. Ils ne feront que vous troubler.

 

Une question s'est posée.


Il y a un panneau avec des boutons, chaque bouton exécute certaines fonctions. Les fonctions appelées en appuyant sur l'un des boutons, appelons-le Exit1, doivent être placées dans une classe distincte CExit1.

Mais ces fonctions utilisent certaines variables globales et méthodes d'autres objets.

Je n'ai pas participé à de grands projets. J'aimerais connaître l'avis d'un expert, comment le faire correctement ?

Je programme souvent de telle sorte que si un fichier mq4 est compilé, toutes les classes et tous les fichiers inclus sont chargés sans erreur et l'EA fonctionne correctement. Cependant, si je compile une classe séparément, j'obtiens des avertissements car certaines variables et fonctions externes ne sont pas visibles.

Voici ma question. Une classe doit-elle se compiler elle-même sans erreur, je veux dire qu'elle doit contenir toutes les copies des variables globales d'EA, les références d'objets, etc. qui sont utilisées ? Si oui, quel serait le meilleur moment pour le faire ? S'il y a beaucoup d'objets qui interagissent, comment les organiser pour qu'il y ait moins de confusion ? Créez-vous des diagrammes de vos programmes s'ils prolifèrent ?

Partagez la façon dont vous écrivez et mettez en œuvre le travail avec vos objets.

 
Vasiliy Pushkaryov:

Une question s'est posée.


Il y a un panneau avec des boutons, chaque bouton exécute certaines fonctions. Les fonctions appelées en appuyant sur l'un des boutons, appelons-le Exit1, doivent être placées dans une classe distincte CExit1.

Mais ces fonctions utilisent certaines variables globales et méthodes d'autres objets.

Je n'ai pas participé à de grands projets. J'aimerais connaître l'avis d'un expert, comment le faire correctement ?

Je programme souvent de telle sorte que si un fichier mq4 est compilé, toutes les classes et tous les fichiers inclus sont chargés sans erreur et l'EA fonctionne correctement. Cependant, si une classe est compilée séparément, certains avertissements peuvent apparaître, car certaines variables et fonctions externes ne sont pas visibles pour la classe.

La question est la suivante . Est-il nécessaire que la classe elle-même compile sans erreur, c'est-à-dire qu'elle contienne déjà toutes les copies utilisées des variables globales, des références aux objets, etc. Si oui, quel serait le meilleur moment pour le faire ? S'il y a beaucoup d'objets qui interagissent, comment les organiser pour qu'il y ait moins de confusion ? Créez-vous des schémas pour vos programmes s'ils prolifèrent ?

Partagez la façon dont vous écrivez et mettez en œuvre le travail avec vos objets.

Les variables et les statistiques globales, à l'exception de celles qui sont inhérentes à la plate-forme, sont une chose maléfique. Et toutes les entités (groupes de classes) doivent être isolées et communiquer entre elles selon un protocole (celui de l'Interface) et rien d'autre.

C'est bien sûr l'idéal :-) Dans la vie réelle, vous prenez la décision et vous vous soutenez vous-même, car personne d'autre ne connaît votre projet, votre idée et votre style.

 
struct A
{
   int x,y;
};

//+------------------------------------------------------------------+
void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   //b = c = a;  //'operator=' - parameter passed as reference, variable expected
}

1. pourquoi ne compile-t-il pas ?

2. existe-t-il un moyen de décrire l'opérateur= et d'utiliser l'opérateur de copie natif ? .... c'est-à-dire un moyen d'appeler::=

 
Igor Makanu:

1. pourquoi ne compile-t-il pas ?
2. Existe-t-il un hack pour décrire l'opérateur= , et utiliser l'opérateur de copie natif ? .... c'est-à-dire un moyen d'appeler ::=

1) L'opérateur d'affectation par défaut dans MQL renvoie le type de données void ;
2) vous pouvez faire quelque chose comme ceci :

struct A{
   int x,y;
   
   A(){}
   A(const A &a){
      this.x = a.x;
      this.y = a.y;
   }
   A operator=(const A &a){
      this.x = a.x;
      this.y = a.y;
      return a;
   }
};

void OnStart(){
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;  
}
 
Sergey Dzyublik:

1) l'opérateur d'affectation par défaut dans MQL renvoie un type de données void ;

ne sont pas d'accord :

struct A
{
   int x[];
};
//+------------------------------------------------------------------+
A myfunc(const int size)
{
   A result;
   ArrayResize(result.x, size);
   for(int i = 0; i < size; i++) result.x[i] = i + 1;
   return(result);
}
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
   a = myfunc(5);
   A b;
   b = a;            // скопировали
   b.x[0] = 99;      // изменили 1-й элемент, чтобы убедиться, что это копия а, а не ссылка как в C#
   ArrayPrint(a.x);
   ArrayPrint(b.x);
}
//+------------------------------------------------------------------+

2020.04.18 18:54:03.855 tst (EURUSD,H1) 1 2 3 4 5

2020.04.18 18:54:03.855 tst (EURUSD,H1) 99 2 3 4 5


Il est clair que l'opérateur d'affectation par défaut renvoie le type de données complet et effectue une copie, sinon de quel vide parlons-nous ?


2. l'exemple est bon, mais je veux conserver la possibilité de copier dans les structures de tableaux par l'opérateur de copie par défaut - je l'ai vérifié, en général il fonctionne assez bien avec les tableaux dynamiques, il y a quelques nuances, mais la question est différente pour le moment

 
Igor Makanu:

L'opérateur d'affectation par défaut renvoie clairement le type de données complet et effectue une copie, sinon de quel vide parlons-nous ?

Faux.

Définissez simplement votre opérateur=, qui renvoie ceci, et vous verrez la différence.

Vous pouvez le voir lorsque le résultat de l'affectation est à nouveau attribué.

struct A
{
   int x;
   int y;
   
   A operator=( const A& a )
   {
      x = a.x;
      y = a.y;
      
      return this;
   }
};

void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;
}
Raison: