OLP. Problemas de aplicación - página 7

 
equivalent23:

Por supuesto:

Me di cuenta de que el problema es cómollenarcorrectamente el array shapes[10] con instancias de clases derivadas de CShape. La opción que sugerí no funciona por alguna razón. Pensemos.
 
Yedelkin:
Me di cuenta de que el problema es cómo llenarcorrectamente el array shapes[10] con instancias de clases derivadas de CShape. Mi variante sugerida no funciona por alguna razón. Pensemos.

El array debe ser de tipo puntero de clase, no de clase propiamente dicha.

Entonces podemos aplicar el nuevo operador.

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

El array debe ser del tipo punteros de la clase, no de la propia clase.

A continuación, puede aplicar el nuevo operador.

¿Puedo darle un ejemplo?

Es que el ejemplo que he puesto está sacado de la documentación y no está claro cómo debería funcionar...

 
Yedelkin:
Me he dado cuenta de que el problema es cómo rellenarcorrectamente el array shapes[10] con instancias de clases derivadas de CShape. Mi variante sugerida no funciona por alguna razón. Pensemos.

Piense o no, 100 rublos no es dinero.

El ejemplo tiene un 100% de fallos, y una implementación así no está bien pensada o no está terminada.

No voy a citar los resultados de mis propios experimentos en código, sólo te daré las conclusiones:

1. Si declaras los objetos no como clases, sino como estructuras, cabrán fácilmente en un array. Pero habrá que eliminar la virialidad, y sólo se podrá trabajar con la funcionalidad del tipo de objetos que tenga el array (en este caso, una clase base);

2. 2. Puedes declararlos como punteros, y entonces puedes formar un array:

a) si no se borran los punteros, se producen fugas de memoria;

b) tampoco se puede trabajar normalmente con la funcionalidad de los descendientes.

PS

Para ser más exactos - la funcionalidad que fue declarada en la clase base está disponible y también visible en las descendientes, pero todo lo que apareció en las descendientes es inaccesible.

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

Un array debe ser de tipo punteros a clases, no de tipo de clase en sí.

A continuación, puede aplicar el nuevo operador.

Sí, yo también pensé en esta dirección, en utilizar punteros. Pero entonces no se cumplen las condiciones de la documentación:

"Para un cuadrado (clase CSquare) el área se calcula a través de los lados, para un círculo (clase CCircle) el área se expresa a través del radio y así sucesivamente. Podemos crear un array para almacenar objetos de tipo CShape, en el que podemos almacenar tanto el objeto de una clase base como todos sus descendientes. Posteriormente podemos llamar a la misma función para cualquier elemento de este array.

...Como necesitamos los valores correspondientes de los miembros m_radio y m_square_side para calcular el área de un cuadrado y de un círculo, hemos añadido las funciones SetRadius y SetSide() a la declaración de la clase correspondiente. Ahora podemos declarar un array de tipo Shape y llenarlo con objetos de clases derivadas..."

 
AlexSTAL:

Un array debe ser de tipo punteros a clases, no de tipo de clase en sí.

A continuación, puede aplicar el nuevo operador.

No funcionará normalmente. Aunque formará una matriz.

Yedelkin:

...Como el cálculo del área de un cuadrado y de un círculo requiere los valores correspondientes de los miembros m_radio y m_square_side, hemos añadido las funciones SetRadius y SetSide() en la declaración de la clase correspondiente. Ahora podemos declarar un array de tipo Shape y llenarlo con objetos de clases derivadas..."

La cuestión es que si el array es del tipo de la clase base, no se puede acceder a la funcionalidad descendiente, es decir, SetRadius() y SetSide() no están disponibles.

Por eso veo tres opciones:

1. El conjunto debe ser homogéneo (si es posible);

2. No entiendo algo sobre la filosofía OOP y la arquitectura de MQL5;

3. O bien los desarrolladores no implementaron el ejemplo, o bien no siguieron la pregunta.

 
Interesting:
No funcionará correctamente. Sin embargo, formará una matriz.
¿Qué quieres decir con que no funcionará?
 
Interesting:

Para ser más exactos - la funcionalidad que fue declarada en la clase base está disponible, y al mismo tiempo es visible en los descendientes, pero todo lo que apareció en los descendientes es inaccesible.

Sí, eso es exactamente lo que me encontré.

Interesante:

El ejemplo es 100 por ciento glitchy ...

Resulta que necesitamos una respuesta de los autores del Manual sobre este tema.

 
Interesting:
No funcionará correctamente. Sin embargo, formará una matriz.

El truco es que si el array es de tipo de clase base, no se puede acceder a la funcionalidad descendiente, es decir, SetRadius() y SetSide() no están disponibles.

Por eso veo tres opciones:

1. El conjunto debe ser homogéneo (si es posible);

2. No entiendo algo sobre la filosofía OOP y la arquitectura de MQL5;

3. los desarrolladores han traicionado un ejemplo que no funciona, o no han completado la tarea.

Ejecutar:

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;
  }

se podría hacer de una manera mucho más sencilla... por la virtualización:

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:
¿Qué quieres decir con que no funcionará normalmente?

1. La funcionalidad de los descendientes no está disponible. No sé quién o cómo, pero personalmente nunca he conseguido acceder a SetRadius() y SetSide() desde el Array.Quizás haya una forma de solucionar el problema con autogenous, pero quiero prescindir de él.

2. Tal vez estoy trabajando mal con los punteros, pero o bien tengo una fuga todo el tiempo o tengo que golpear los punteros justo en el bloque donde se hace el trabajo principal.