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

 
SemenTalonov:

Questo è quello che mi aspettavo dalla copia... Il costruttore di copie predefinito non è un errore.

MaDmitry dice che un nuovo oggetto verrà allocato in memoria e verrà restituito un puntatore di tipoPOINTER_AUTOMATIC.

Ognuno capisce le stranezze di MQL a modo suo)

Sì, si scopre che non c'è nessun Babbo Natale.

Non ho scritto su nessun oggetto in memoria.

OK, una volta c'erano delle controversie su come distinguere un riferimento da un puntatore. Ma ora sembra che non si possa distinguere un oggetto da un puntatore.

 
Dmitry Fedoseev:

Da dove viene la copia di un oggetto? Una copia di un puntatore, sì, ma che punta allo stesso oggetto.

Abbiamo un array di oggetti. Un operatore di assegnazione viene chiamato sul primo elemento di questo array, che viene passato all'oggetto creato separatamente (anche se l'operatore non è dichiarato). Cosa pensi che dovrebbe esserci nel primo elemento dell'array dopo questo? Secondo me, l'oggetto dovrebbe rimanere.

 
SemenTalonov:

Il mio punto è che un costruttore di copie dichiarato esplicitamente non cambierebbe nulla in questo test.

Come potete non vedere l'ovvio...

Un elemento dell'array di oggetti contiene un puntatore e un oggetto nell'elemento dell'array di puntatori... è davvero normale?

Nel primo caso, un puntatore a un oggetto va all'array, nel secondo caso, il costruttore di copie dovrebbe funzionare, come possono essere equivalenti queste operazioni?

Non il costruttore di copie, ma l'operatore di assegnazione, ma queste sono le piccole cose.

È l'oggetto che dovrebbe andare in un elemento di una matrice di oggetti.

Nel primo caso - avete esattamente un array di oggetti, che tipo di "puntatori"?

 
Georgiy Merts:

Abbiamo un array di oggetti. L'operatore di assegnazione viene chiamato al primo elemento di questo array e gli viene passato l'oggetto creato separatamente. Cosa pensi che dovrebbe esserci nel primo elemento di questo array dopo questo? Secondo me, l'oggetto dovrebbe rimanere.

А... Non va affatto bene lì))) Array di puntatori automatici, e in esso anche l'oggetto creato dinamicamente. Poi ci sono 3 oggetti, due di loro saranno automaticamente cancellati e uno perderà. Se viene compilato.

 

Dovrebbe essere così:

A* m_A[2];

e così:

m_A[0] =GetPointer(a); 
 

E alla fine fa così:

for(int i=0;i<2;i++)if(CheckPointer(m_A[i])==POINTER_DINAMIC)delete(m_A[i]); 
 
Dmitry Fedoseev:

А... Non va affatto bene lì))) Un array di puntatori automatici, e anche un oggetto creato dinamicamente.

Finalmente!))

Georgiy Merts:

È l'oggetto che deve essere messo nell'elemento dell'array di oggetti.

Nel primo caso - avete esattamente un array di oggetti, quali "puntatori"?

Questo è il mio punto! Perché FUNZIONA!

m_A[1] = new A();
 
SemenTalonov:

Finalmente!))

Questo è il mio punto! Perché FUNZIONA!

Se A è dichiarato tale:

A* m_A[2]; 

Allora va bene.

E se è così

A m_A[2]; 

Non dovrebbe compilare. O c'è un bug nel compilatore, o il compilatore non deve pensare per tutti.

 
Probabilmente non è un bug, ma l'assegnazione di oggetti semplici dovrebbe funzionare, quindi devi fare attenzione a cancellare l'oggetto che hai creato con new.
 
Dmitry Fedoseev:

Allora non dovrebbe compilare. O c'è un bug nel compilatore, o il compilatore non deve pensare per tutti.

Bingo!

SemenTalonov2019.01.10 07:36POINTER_AUTOMATIC in un puntatore di tipoPOINTER_DYNAMIC e viceversa.