OLP. Problèmes d'application - page 7

 
equivalent23:

Bien sûr :

J'ai réalisé que le problème était deremplircorrectement le tableau shapes[10] avec des instances de classes dérivées de CShape. L'option que j'ai suggérée ne fonctionne pas pour une raison quelconque. Réfléchissons.
 
Yedelkin:
J'ai réalisé que le problème était de remplircorrectement le tableau shapes[10] avec des instances de classes dérivées de CShape. La variante que je propose ne fonctionne pas pour une raison quelconque. Réfléchissons.

Le tableau doit être de type pointeur de classe, et non de type classe lui-même.

Ensuite, nous pouvons appliquer un nouvel opérateur.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
AlexSTAL:

Le tableau doit être du type pointeurs de classe, et non de la classe elle-même.

Ensuite, vous pouvez appliquer le nouvel opérateur.

Je peux vous donner un exemple ?

C'est juste que l'exemple que j'ai donné est tiré de la documentation et que la façon dont cela devrait fonctionner n'est pas claire...

 
Yedelkin:
J'ai réalisé que le problème est de savoir comment remplircorrectement le tableau shapes[10] avec des instances de classes dérivées de CShape. La variante que je propose ne fonctionne pas pour une raison quelconque. Réfléchissons.

Que tu le penses ou non, 100 roubles, ce n'est pas de l'argent.

L'exemple est à 100 % glitchy, et une telle mise en œuvre est soit mal pensée, soit inachevée.

Je ne citerai pas les résultats de mes propres expériences en matière de code, je ne vous donnerai que les conclusions :

1. Si vous déclarez les objets non pas comme des classes mais comme des structures, ils s'intègreront facilement dans un tableau. Mais la virialité devra être supprimée, et vous ne pourrez travailler qu'avec la fonctionnalité du type d'objets que possède le tableau (dans ce cas, une classe de base) ;

2. 2) Vous pouvez les déclarer en tant que pointeurs, puis vous pouvez former un tableau :

a) si les pointeurs ne sont pas effacés, des fuites de mémoire se produisent ;

b) vous ne pouvez pas non plus travailler normalement avec la fonctionnalité descendante.

PS

Pour être plus exact - la fonctionnalité qui a été déclarée dans la classe de base est disponible et également visible dans les descendants, mais tout ce qui est apparu dans les descendants est inaccessible.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
AlexSTAL:

Un tableau doit être de type pointeur vers une classe, et non de type classe elle-même.

Ensuite, vous pouvez appliquer le nouvel opérateur.

Oui, j'ai aussi pensé dans cette direction, à l'utilisation de pointeurs. Mais alors les conditions de la documentation ne sont pas remplies :

"Pour un carré (classe CSquare), l'aire est calculée par les côtés, pour un cercle (classe CCircle), l'aire est exprimée par le rayon et ainsi de suite. Nous pouvons créer un tableau pour stocker les objets de type CShape, dans lequel nous pouvons stocker à la fois l'objet d'une classe de base et tous ses descendants. Plus tard, nous pourrons appeler la même fonction pour n'importe quel élément de ce tableau.

...Comme nous avons besoin des valeurs correspondantes des membres m_radius et m_square_side pour calculer l'aire d'un carré et d'un cercle, nous avons ajouté les fonctions SetRadius et SetSide() à la déclaration de la classe correspondante. Maintenant nous pouvons déclarer un tableau de type Shape et le remplir d'objets de classes dérivées..."

 
AlexSTAL:

Un tableau doit être de type pointeur vers une classe, et non de type classe elle-même.

Ensuite, vous pouvez appliquer le nouvel opérateur.

Il ne fonctionnera pas normalement. Bien que cela forme un tableau.

Yedelkin:

...Comme le calcul de l'aire d'un carré et d'un cercle nécessite des valeurs correspondantes des membres m_radius et m_square_side, nous avons ajouté les fonctions SetRadius et SetSide() dans la déclaration de la classe correspondante. Maintenant nous pouvons déclarer un tableau de type Shape et le remplir d'objets de classes dérivées..."

Le problème est que si le tableau est de type classe de base, on ne peut pas accéder à la fonctionnalité descendante, c'est-à-dire que SetRadius() et SetSide() deviennent indisponibles.

C'est pourquoi je vois trois options :

1. le réseau doit être homogène (si possible) ;

2. Je ne comprends rien à la philosophie OOP et à l'architecture de MQL5 ;

3. soit les développeurs n'ont pas réussi à mettre en œuvre l'exemple, soit ils n'ont pas donné suite à la question.

 
Interesting:
Il ne fonctionnera pas correctement. Il formera un tableau, cependant.
Comment ça, ça ne marchera pas ?
 
Interesting:

Pour être plus exact - la fonctionnalité qui a été déclarée dans la classe de base est disponible, et en même temps elle est visible aux descendants, mais tout ce qui est apparu aux descendants est inaccessible.

Oui, c'est exactement ce que j'ai trouvé.

Intéressant:

L'exemple est 100 pour cent glitchy ...

Il s'avère que nous avons besoin d'une réponse des auteurs du manuel à ce sujet.

 
Interesting:
Il ne fonctionnera pas correctement. Il formera un tableau, cependant.

L'astuce est que si le tableau est de type classe de base, la fonctionnalité descendante n'est pas accessible, c'est-à-dire que SetRadius() et SetSide() ne sont pas disponibles.

C'est pourquoi je vois trois options :

1. le réseau doit être homogène (si possible) ;

2. Je ne comprends rien à la philosophie OOP et à l'architecture de MQL5 ;

3. les développeurs ont soit trahi un exemple qui ne fonctionne pas, soit ils n'ont pas terminé la tâche.

Exécuter :

class CBase
  {
public:
   void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   ((CTest *)Base).m_radius();
   delete Base;
  }

vous pouvez faire des choses beaucoup plus simples... la virtualisation :

class CBase
  {
public:
   virtual void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   virtual void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   delete Base;
  }
 
AlexSTAL:
Comment ça, il ne fonctionne pas normalement ?

1. La fonctionnalité descendante n'est pas disponible. Je ne sais pas qui ou comment, mais personnellement je n'ai jamais eu accès à SetRadius() et SetSide() à partir de l'Array.Peut-être y a-t-il un moyen de résoudre le problème avec autogenous, mais je veux m'en passer.

2. Peut-être que je travaille mal avec les pointeurs, mais soit j'ai tout le temps une fuite, soit je dois frapper les pointeurs directement dans le bloc où le travail principal est effectué.

Raison: