MQL5 Il compilatore non distingue tra una classe e un puntatore ad essa - pagina 7

 
Alexey Navoykov:
Quindi stai proponendo di vietare del tutto la denominazione implicita dei puntatori? Non credo che molte persone qui sarebbero felici di questo.

Che tutti abbiano una scelta.

#property strict

Di certo non voglio quel tipo di trucco.

 
SemenTalonov:

Beh, non c'è bisogno di dirlo. C'è una perdita di memoria.

Una perdita di memoria, dite? Che ne dite di questo? )))

#property strict

class A
 {
  A*  item;
  int num;
public:
  A(int p=10){num=p;item=NULL;} ~A(){if(CheckPointer(item)==POINTER_DYNAMIC) delete item;}
  A* operator=(A* par){ item = par; return&this; }
  A* operator~(){ return item; }
  int operator-(){ return num; }
 };

void OnStart()
 {
  A a = new A(20);
  printf("В автообъекте %i (%i) сохранен динамический объект %i (%i), который он в конце своего цикла сам уничтожает...",&a,-a,~a,-~a);
 }


 
Ilya Malev:

Una perdita di memoria, dite? Che ne dite di questo? )))


delete item;

Quindi presuppone che il soggetto sia preparato ad essere trattato in quel modo. Quanti prevedono questa possibilità?

 
SemenTalonov:

Quindi questo presuppone che il soggetto sia preparato ad essere trattato in questo modo. Molte persone prevedono una tale possibilità?

Penso che se qualcuno scrive la parola new, dovrebbe sapere esattamente dove si trova la parola delete corrispondente altrove nel suo codice.

 
Questa costruzione, a proposito, se un po' raffinata, si chiama "raccoglitore di rifiuti"))
 
SemenTalonov:

Che tutti abbiano una scelta.

Non ho certo bisogno di questi trucchi.

Lo uso già in MQL4. Come funzionerà allora, se la sintassi della lingua è la stessa?

Bene, come protezione contro tali azioni si può creare un metodo privato in una classe:

class A
{
 private: void operator=(const A*);
}

Anche se, francamente, non vedo un problema qui. Se si assegna qualcosa a un oggetto di classe, ci si aspetta a priori che l'operatore di copia venga chiamato. Se lo vuoi, lo ottieni. Che differenza fa se c'era un puntatore o un oggetto? Il tipo di classe è lo stesso, non si può assegnare nessuna classe sinistra. Ecco perché tutto sembra più che altro una noia inattiva.

Il caso opposto, con il puntatore a sinistra, è un'altra questione. Lì ci si poteva aspettare di assegnare qualcosa al puntatore, ma si è rivelato essere la copia di un oggetto.

 
Alexey Navoykov:

Il caso opposto, con il puntatore a sinistra, è diverso: lì ci si potrebbe aspettare di assegnare qualcosa al puntatore, ma si scopre che si sta copiando un oggetto.

E non potete vietarlo, altrimenti non sarete in grado di copiare l'oggetto quando ne avete davvero bisogno.

Di conseguenza, bisogna lasciare tutto com'è. Basta essere consapevoli di ciò che si sta facendo.

 
fxsaber:

E non potete vietarlo, altrimenti non sarete in grado di copiare l'oggetto quando ne avete davvero bisogno.

Alla fine, bisogna lasciare le cose come stanno. Basta essere consapevoli di ciò che si sta facendo.

О! Questa è la cosa principale.

Ci sono molte persone qui che sanno come navigare nelle modalità di gestione della memoria? Capire la differenza tra AUTOMATICO e DINAMICO.

E ho sentito parlare di STATIC e BASED (anche se questo non è necessario).

 
fxsaber:

E non potete vietarlo, altrimenti non sarete in grado di copiare l'oggetto quando ne avete davvero bisogno.

Alla fine, bisogna lasciare le cose come stanno. Basta essere consapevoli di ciò che si sta facendo.

Perché non può funzionare? Ci sono gli operatori * e & per convertire in quello che ti serve.
 
Alexey Navoykov:
Perché non può funzionare? Ci sono gli operatori * e & per ridurlo a ciò che è richiesto.

Dove c'è un *?