Domande su OOP in MQL5 - pagina 86

 
Igor Makanu:

che ha senso

ma ho il sospetto che l'intero punto sia di usarlo con metodi statici

Ho bisogno di testarlo, ma non so come, così ho chiesto


UPD: cercato su Google questo argomento ieri, un sacco di menzioni di distruttore privato, anche bisogno di pensare a cosa può fare

I metodi statici non hanno un puntatore this e non possono fare nulla con quel puntatore.

Il distruttore privato garantisce che l'oggetto sarà cancellato dall'oggetto stesso. Ma come ho detto sopra, non è una buona pratica da evitare secondo me (anche se, a volte è abbastanza comodo, e in SETTE casi è accettabile usarlo).

 
Georgiy Merts:

I metodi statici non hanno un puntatore this e non possono fare nulla con questo puntatore.

Potrei aver frainteso il tuo messaggio, ma sono consapevole che il metodo non ha un puntatore a questo, solo l'istanza dell'oggetto stesso lo fa, ho scritto perché dai campi della classe del metodo statico sono disponibili, e molto probabilmente è possibile manipolare con la cancellazione

l'obiettivo è quello di guardare questo disegno, non ho mai provato, e non è un modo comune


Sergey Dzyublik:

1) Dai metodi statici, l'accesso a questo è vietato.
Dov'è "delete &this;" - https://stackoverflow.com/questions/447379/what-is-the-use-of-delete-this

2) Il distruttore privato vieta di creare un oggetto sullo stack, ma potete ancora crearlo attraverso l'operatore new, questa volta nell'heap:

Ecco un altro uso di delete &this.

grazie, lo controllerò, è utile




occupato, tutto in riparazione, chiederò più tardi... Così su due piedi, cosa succede se una classe base ha un metodo con

delete &this;

e da una classe derivata chiamare un metodo con la classe base rimossa.... nessuno scopo pratico, ma per ora voglio capirlo

 
Igor Makanu:

Potrei aver frainteso il tuo messaggio, ma sono consapevole che il metodo non ha un puntatore this, solo l'istanza dell'oggetto stesso lo fa, l'ho scritto perché i campi della classe sono disponibili dal metodo statico, e molto probabilmente puoi manipolare con la cancellazione

finora lo scopo di guardare questo disegno, non l'ho mai provato e non è un modo comune


Grazie, lo controllerò, è utile.




Occupato, tutto in riparazioni, chiederò più tardi... Così su due piedi, cosa succede se una classe base ha un metodo con

e da una classe derivata chiamare un metodo con la classe base rimossa.... nessuno scopo pratico, ma per ora voglio capirlo

Non preoccupatevi, non ne avrete mai bisogno.

Bisogna capire le basi della lingua prima di occuparsi di queste cose.

 
Koldun Zloy:

Non preoccupatevi, non ne avrete mai bisogno.

Non è un'affermazione corretta, se non espandi i tuoi orizzonti, ovviamente non ne avrai bisogno.

Koldun Zloy:

È necessario capire le basi della lingua prima di affrontare queste cose.

Lo faccio il più possibile, ma in generale risolvo il 90+% dei compiti MQL da zero, la maggior parte di essi sono già risolti e liberamente accessibili.



riguardante la cancellazione di &this; ... ... Ho usato una classe-ordine che monitorava la sua apertura e a requotes era in grado di riaprire l'ordine ... ... e molte altre cose,

ho creato e cancellato questo oggetto (classe ordine) da un'altra classe, potrei trovare più conveniente usaredelete &this;...

 

Mi chiedo se questo è un glitch o una caratteristica)

C'è una struttura all'interno dell'istanza della classe.

Ho messo un punto per vedere il contenuto della struttura.
Ma viene visualizzato solo se metto le parentesi quadre.
Anche se la struttura è in una singola istanza.

il problema è risolto se la classe non è un elemento dell'array.




e il codice stesso per "curiosare"

class ABC
{   
   public:         
           struct ST
           {    
              int r;
              int U;
                  ST() {r=0; U=0;}           
           };
           ST st;
};
ABC abc[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

abc[0].st.r;

   return(INIT_SUCCEEDED);
  }
 
Pavel Verveyko:

Mi chiedo se questo è un glitch o una caratteristica)

C'è una struttura all'interno dell'istanza della classe.

Ho messo un punto per vedere il contenuto della struttura.
Ma viene visualizzato solo se metto le parentesi quadre.
Anche se la struttura è in una singola istanza.

il problema è risolto se la classe non è un elemento dell'array.




e il codice stesso per "curiosare"

questo potrebbe essere giusto :-)

 
Maxim Kuznetsov:

probabilmente è giusto :-)

forse) ma non cambia il punto sul tooltip)

 
Pavel Verveyko:

Mi chiedo se questo è un glitch o una caratteristica)

C'è una struttura all'interno dell'istanza della classe.

Ho messo un punto per vedere il contenuto della struttura.
Ma viene visualizzato solo se metto le parentesi quadre.
Anche se la struttura è in una singola istanza.

il problema è risolto se la classe non è un elemento dell'array.




e il codice stesso per "frugare"

Un altro bug del redattore(
 

https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html

Везде, где это возможно, заменяйте глобальные переменные локальными.

Ci vogliono più comandi per accedere alle variabili globali che per accedere alle variabili locali. Inoltre, a meno che non sia esplicitamente dichiarato il contrario, il compilatore assume che la subroutine chiamata possa cambiare i valori di tutte le variabili globali. Così, dopo che la subroutine è chiamata, i valori di tutte le variabili globali sono caricati in memoria ripetutamente, il che porta a una degradazione delle prestazioni.


Se avete bisogno di accedere a una variabile globale (che non è condivisa da questo thread e da altri), copiate il suo valore in una variabile locale e lavorate con la copia.

L'uso di una copia locale dà un guadagno di prestazioni, tranne quando la variabile globale viene acceduta solo una volta.


Se nel mio esempio:

class CEA
{
private:
   double            _Ask, _Bid;
public:
   void              onTick(const MqlTick &tick);
};
//+------------------------------------------------------------------+
void CEA::onTick(const MqlTick &tick)
{
   _Ask = tick.ask;
   _Bid = tick.bid;
}

nel metodo onTick(), copiare i valori ask e bid e usare _Ask, _Bid (commercio virtuale) nel resto dei metodi

sarà come lavorare con le variabili globali?

ZS: come opzione, naturalmente posso passare per riferimento &tick in tutti i metodi, ma di nuovo, domande, cosa è più efficace

 
Igor Makanu:

https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html


se nel mio esempio:

copiare i valori asc e bid nel metodo onTick() e usare _Ask, _Bid (commercio virtuale) nel resto dei metodi

sarà come lavorare con le variabili globali?

ZS: come opzione, posso naturalmente passare per riferimento &tick a tutti i metodi, ma di nuovo, si chiede cosa sia più efficace

Igor Makanu:

https://www.ibm.com/support/knowledgecenter/ru/ssw_aix_72/performance/coding_style_best_perf.html


Se nel mio esempio:

nel metodo onTick() copia i valori di asc e bid e usa _Ask, _Bid (commercio virtuale) in altri metodi

sarà come lavorare con le variabili globali?

ZS: come opzione, naturalmente posso passare per riferimento &tick in tutti i metodi, ma di nuovo, si chiede cosa sia più efficace

Domanda. A cosa serve la capra? Se in un metodo, una classe, in un cavallo sferico, sì in un vuoto fisico (beh io sono ubriaco)))), allora sì, ha senso. E se in un progetto reale, o una classe a livello globale, o una singola che gestisce tutto questo trichomudin (scusate l'extra bourbon))))) all'inizio del gestore, e, richiesta direttamente da esso in qualsiasi luogo))
Motivazione: