Errores, fallos, preguntas - página 1696

 
Stanislav Korotky:

En primer lugar, no está claro si se ha intentado declarar el método como virtual o no. Si tiene que ser virtual, entonces escriba virtual en la clase base, no en la clase derivada (porque de lo contrario los punteros de la base serán arrancados al método de la base incluso si usted pone la instancia de la clase derivada en ella).

Si no quieres sobrescribir un método en una clase derivada, no lo menciones en absoluto, y si lo haces, debe ser sobrescrito con un cuerpo.

Por último, para ocultar el método de la clase derivada, hay que introducir una clase intermedia en la que se mueva el método a la zona priivada o se haga privado en la clase base (pero entonces, ¿por qué es virtual?).

He aquí un ejemplo

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class roditel
  {
public:

   virtual int one(void)
     {
      return 1;
     }
   virtual int two(void)
     {
      return 2;
     }
   virtual int three(void)
     {
      return 3;
     }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class naslednic_1 : public roditel
  {
public:
   virtual int       two(void);
   virtual int       three(void);
  };

naslednic_1 go;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   go.two();
// 'two' - function must have a body    TEst.mq4        42      7
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak:

He aquí un ejemplo

Este ejemplo es más o menos igual que el primero ;-). ¿Has abierto mi carta pero no la has leído? ¿Qué quieres conseguir declarando de nuevo los métodos en el descendiente pero sin definirlos? Para llamar a la implementación básica sin tener una nueva, no es necesario mencionarlas en la descendente.
 
Stanislav Korotky:
Este ejemplo es más o menos igual que el primero ;-). ¿Mi carta fue abierta, pero no la leyó? ¿Qué quieres conseguir redeclarando los métodos en el descendiente, pero sin definirlos? Para llamar a una implementación básica sin tener una nueva, no es necesario declararla en la descendente.

Quiero ver sólo 10 métodos heredados más los métodos creados en la clase descendiente. No necesito 190 métodos, que no estarán relacionados con la clase actual de ninguna manera.

Por ejemplo, tengo una clase base donde se describen todas las propiedades máximas de las formas, ancho, alto, esquinas, radios, colores, área.

En base a estos métodos de las propiedades, hago una clase descendiente que utiliza los métodos de la clase padre, radio, color, área... Pero no necesito esquinas y anchura aquí ...

En base a estos métodos, hago una clase descendiente de triángulo que utiliza los métodos de la clase padre, color, área, esquinas... Pero no necesito el radio aquí ...

Cuando pregunto por qué, la clase padre tiene un grupo de métodos que son comunes a todos o comunes a un grupo de formas, como el color, el método de estilo.

 
Vladimir Pastushak:

Quiero ver sólo 10 métodos heredados más los métodos creados en la clase descendiente. No necesito 190 métodos, que no estarán relacionados con la clase actual de ninguna manera.

Por ejemplo, tengo una clase base donde se describen todas las propiedades máximas de las formas, ancho, alto, esquinas, radios, colores, área.

En base a estos métodos de propiedades, hago una clase derivada del círculo que utiliza métodos de la clase padre, radio, color, área... Pero no necesito esquinas y anchura aquí ...

En base a estos métodos, hago una clase descendiente de triángulo que utiliza los métodos de la clase padre, color, área, esquinas... Pero no necesito el radio aquí ...

Cuando pregunté por qué, la clase padre tiene un grupo de métodos que es común a todos o común a un grupo de formas, como el color, el método de estilo.

No entiendo: esta pregunta, ¿es una pregunta o una respuesta suscrita? Normalmente lo hacen: en la clase base es común, y luego en las descendientes se añaden las particulares. ¿Por qué hacerlo a la inversa? ¿Cuál es el objetivo?

Pero incluso si no se profundiza, ya he sugerido una opción: insertar un descendiente intermedio en el que todas las propiedades y métodos innecesarios se mueven a la parte privada.

 
Pregunta a la administración, ¿cuándo se podrán ver las nuevas estadísticas actualizadas de los servicios?
 
Vladimir Pastushak:

Hay 200 métodos en la clase padre, quiero ver sólo 10 métodos heredados más los creados en la clase hija, no necesito 190 métodos más que no estén relacionados con la clase actual.

Para ello, hay que declarar la herencia como protegida o privada, y luego anular los métodos que se necesiten.

class naslednic_1 : protected roditel
  {
public:
   virtual int       two(void)   { return roditel::two(); }
   virtual int       three(void) { return roditel::three(); }
  };
 
Alexey Navoykov:

Para ello, hay que declarar la herencia como protegida o privada, y luego anular los métodos que quieras.

Stanislav Korotky:

No entiendo: ¿esta pregunta es una pregunta o una respuesta incompleta? Normalmente lo hacen así: en una clase base la general, y luego en las descendientes añaden las particulares. ¿Por qué hacer lo contrario? ¿Cuál es el objetivo?

Pero incluso si no se profundiza demasiado, ya he sugerido una opción: insertar un descendiente intermedio en el que todas las propiedades y métodos innecesarios se mueven a la parte privada.

Gracias.

Alexey, tu ejemplo no funciona, en todo caso, el hijo recibe los métodos del padre, que no deben ser volcados.


 
¿Cómo puedo saber miINDICATOR_SHORTNAME? Faltan las funciones IndicatorGet*.
 
Alexey Kozitsyn:
¿Qué pasa si cambias el nombre corto cuando lo creas?

¿Y cambiar cada vez?

Si el indicador contiene topes indicadores, la autoidentificación es fácil, pero sin topes, no veo todavía una solución.

 
fxsaber:
¿Cómo puedo saber miINDICATOR_SHORTNAME? Las funciones IndicatorGet* no existen.
Print(MQLInfoString(MQL_PROGRAM_NAME)); devuelve el nombre corto del indicador. Si no se especifica un nombre corto, se devuelve el nombre completo.