Domande su OOP in MQL5 - pagina 5

 
I commenti non relativi a questo argomento sono stati spostati in "Tutte le domande dei neofiti su MQL4 e MQL5, aiuto e discussione su algoritmi e codici".
 
Vladimir Simakov:
Dai, lo uso sempre.

Dove, in quale luogo e come?

Moderatori, scusate se ripeto la domanda. Voglio davvero avere una risposta.

 
Artyom Trishkin:

Perché dovreste riassegnare intenzionalmente un puntatore passato a una funzione? Naturalmente, ci sarà una perdita. Ma questo non è un "classico leak", ma un classico errore di lavorare con un puntatore a un oggetto.

Non dovete creare un nuovo oggetto qui, ma gestire l'oggetto esterno il cui puntatore è stato passato nella funzione.

Questo non sono io. È preso dal codice di qualcun altro su questo thread. Viene preso come esempio.
 
Dmitry Fedoseev:

Dove, in quale luogo e come?

Moderatori, scusate se ripeto la domanda. Voglio davvero avere una risposta.

Abbiate pazienza. Torno a casa e lo pubblico.
 
Dmitry Fedoseev:

Dove, in quale luogo e come?

Moderatori, scusate se ripeto la domanda. Voglio davvero avere una risposta.

Se ho capito bene la domanda, dichiariamo la classe come oggetto usando new.
Poi usate un punto per chiamare i metodi pubblici della classe attraverso l'oggetto creato.
Dopo che tutti i metodi chiamati sono stati eseguiti, svuotiamo la memoria cancellando l'oggetto creato delete.

 
Roman:

Se ho capito bene la domanda, dichiariamo la classe come oggetto usando new.
Poi chiamiamo i metodi pubblici della classe attraverso l'oggetto creato, usando un punto.
Dopo che tutti i metodi chiamati sono stati eseguiti, svuotiamo la memoria cancellando l'oggetto creato delete.

No. All'inizio pensavo fosse un parametro di funzione come questo - oggetto ma non per riferimento, ma c'è un punto e virgola alla fine. Se è una normale creazione di un oggetto alla dichiarazione, allora perché è tra parentesi? Quindi per ora rimane il mistero del secolo.

 
Dmitry Fedoseev:

No. All'inizio pensavo fosse un parametro di funzione come questo - oggetto ma non per riferimento, ma c'è un punto e virgola alla fine. Se è una normale creazione di un oggetto alla dichiarazione, allora perché è tra parentesi? Quindi per ora rimane il mistero del secolo.

Tra parentesi - perché è una nota sul testo))))
 
Artyom Trishkin:

E perché avete deliberatamente riassegnato un puntatore passato a una funzione? Naturalmente, ci sarà una perdita. Ma non è una "perdita classica", ma un classico errore di gestione di un puntatore a un oggetto.

Non è necessario creare un nuovo oggetto qui, ma gestire l'oggetto esterno il cui puntatore è stato passato nella funzione.

Non si tratta del mio esempio, ma dell'implementazione dei puntatori stessi in MQL - se non è necessario dereferenziarli (e il puntatore può essere assegnato a un'istanza dell'oggetto!), se invece di passare un puntatore si può passare un riferimento all'oggettohttps://www.mql5.com/ru/forum/1111/page2471#comment_11796665

qui non abbiamo informazioni dettagliate su dove e quando (CObj& obj) è apparso (& non è un'operazione di dereferenziazione del puntatore, ma l'acquisizione di un puntatore GetPointer() )

Ok, non voglio sprecare informazioni... Mi sono già detto, e lo ripeterò ancora una volta in questo forum - MQL non è C++, è così che è implementato - beh, non ho altre opzioni

 
Igor Makanu:

Non si tratta del mio esempio, ma dell'implementazione dei puntatori stessi in MQL - se non è necessario dereferenziarli (e il puntatore può essere assegnato a un'istanza dell'oggetto!), se invece di passare un puntatore si può passare un riferimento all'oggetto https://www.mql5.com/ru/forum/1111/page2471#comment_11796665

qui non abbiamo informazioni dettagliate su dove e quando (CObj& obj) è apparso (& non è un'operazione di dereferenziazione del puntatore, ma l'acquisizione di un puntatore GetPointer() )

Ok, non voglio sprecare informazioni... Mi sono già detto, e lo ripeterò ancora una volta in questo forum - MQL non è C++, è così che è implementato - beh, non ho altre opzioni

Sei drammatico, non ci sono complessità e confusioni.

 
Vladimir Simakov:
Le parentesi sono perché questa è una nota sul testo))))

Quindi ci siamo.

Come questo:

void z(CObj * o){
}

Non solo può, ma meglio, perché si può chiamare così:

CObj obj;
z(GetPointer(obj));

Se passate un puntatore per riferimento, avete bisogno di un'altra variabile per il puntatore.

***

E se un puntatore deve essere passato a una funzione per creare un oggetto nella funzione, ecco come funziona:

class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;

void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){
   o = new CObj();
}
Questo è praticamente tutto quello che volevate sapere sull'OOP, ma avevate paura di chiedere)))