Errori, bug, domande - pagina 1696

 
Stanislav Korotky:

In primo luogo, non è chiaro se sia stato fatto il tentativo di dichiarare il metodo come virtuale o meno. Se deve essere virtuale, allora scrivete virtuale nella classe base, non nella classe derivata (perché altrimenti i puntatori di base saranno strappati al metodo base anche se ci mettete un'istanza della classe derivata).

Se non volete sovrascrivere un metodo in una classe derivata, non menzionatelo affatto, e se lo fate, dovrebbe essere sovrascritto con un corpo.

Infine, per nascondere il metodo alla classe derivata, è necessario introdurre una classe intermedia dove si sposta il metodo nell'area priivata o lo si rende privato nella classe base (ma allora perché è virtuale?).

Ecco un esempio

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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:

Ecco un esempio

Questo esempio è circa lo stesso del primo ;-). Hai aperto la mia lettera ma non l'hai letta? Cosa vuoi ottenere dichiarando i metodi di nuovo nel discendente ma non definendoli? Per chiamare l'implementazione di base senza averne una nuova, non è necessario menzionarle nel discendente.
 
Stanislav Korotky:
Questo esempio è circa lo stesso del primo ;-). La mia lettera è stata aperta, ma non l'hai letta? Cosa vuoi ottenere ridichiarando i metodi nel discendente, ma non definendoli? Per chiamare un'implementazione di base senza averne una nuova, non è necessario dichiararle nel discendente.

Voglio vedere solo 10 metodi ereditati più i metodi creati nella classe discendente. Non ho bisogno di 190 metodi, che non saranno legati alla classe corrente in alcun modo.

Per esempio, ho una classe base dove sono descritte tutte le proprietà massime delle forme, larghezza, altezza, angoli, raggi, colori, area.

Sulla base di questi metodi di proprietà, faccio una classe derivata dal cerchio che usa i metodi della classe madre, raggio, colore, area... Ma non ho bisogno di angoli e larghezza qui ...

Sulla base di questi metodi, faccio una classe triangolo discendente che usa i metodi della classe padre, colore, area, angoli... Ma non ho bisogno di raggio qui ...

Quando chiedo perché, la classe madre ha un gruppo di metodi che sono comuni a tutti o comuni a un gruppo di forme, come il colore, il metodo dello stile.

 
Vladimir Pastushak:

Voglio vedere solo 10 metodi ereditati più i metodi creati nella classe discendente. Non ho bisogno di 190 metodi, che non saranno legati alla classe corrente in alcun modo.

Per esempio, ho una classe base dove sono descritte tutte le proprietà massime delle forme, larghezza, altezza, angoli, raggi, colori, area.

Sulla base di questi metodi di proprietà, faccio una classe derivata dal cerchio che usa i metodi della classe madre, raggio, colore, area... Ma non ho bisogno di angoli e larghezza qui ...

Sulla base di questi metodi, faccio una classe triangolo discendente che usa i metodi della classe padre, colore, area, angoli... Ma non ho bisogno di raggio qui ...

Quando ho chiesto perché, la classe genitore ha un gruppo di metodi che è comune a tutti o comune a un gruppo di forme, per esempio metodo colore, stile.

Non capisco: questa domanda - una domanda o una risposta scritta? Di solito lo fanno - nella classe base è comune, e poi nei discendenti aggiungono dei particolari. Perché fare il contrario? Qual è lo scopo?

Ma anche se non vai più a fondo, ho già suggerito un'opzione - inserire un discendente intermedio in cui tutte le proprietà e i metodi non necessari sono spostati nella parte privata.

 
Domanda all'amministrazione, quando sarà possibile vedere le nuove statistiche aggiornate dei servizi?
 
Vladimir Pastushak:

Ci sono 200 metodi nella classe madre, voglio vedere solo 10 metodi ereditati più quelli creati nella classe figlia, non ho bisogno di altri 190 metodi che non sono legati alla classe corrente.

Per farlo, dovete dichiarare l'ereditarietà come protetta o privata e poi sovrascrivere i metodi di cui avete bisogno.

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

Per farlo, dovete dichiarare l'ereditarietà come protetta o privata e poi sovrascrivere i metodi che volete.

Stanislav Korotky:

Non capisco: questa domanda è una domanda o una risposta incompleta? Di solito lo fanno in questo modo - in una classe base il generale, e poi nei discendenti aggiungono i particolari. Perché fare il contrario? Qual è lo scopo?

Ma anche se non si va troppo in profondità, ho già suggerito un'opzione - inserire un discendente intermedio in cui tutte le proprietà e i metodi non necessari vengono spostati nella parte privata.

Grazie.

Alexey, il tuo esempio non funziona, in ogni caso, il bambino riceve i metodi dei genitori, che non dovrebbero essere scaricati.


 
Come faccio a conoscere il mioINDICATOR_SHORTNAME? Mancano le funzioni IndicatorGet*!
 
Alexey Kozitsyn:
Cosa succede se cambiate il nome breve quando lo create?

E cambiare ogni volta?

Se l'indicatore contiene buffer indicatori, l'auto-identificazione è facile, ma senza buffer, non vedo ancora una soluzione.

 
fxsaber:
Come faccio a conoscere il mioINDICATOR_SHORTNAME? Le funzioni IndicatorGet* non esistono!
Print(MQLInfoString(MQL_PROGRAM_NAME)); restituisce il nome breve dell'indicatore. Se non viene specificato un nome breve, viene restituito il nome completo.