Domande su OOP in MQL5 - pagina 74

 
Vladimir Simakov:

Non ci sono puntatori qui) C'è un handle per la classe, e lavorare con esso è simile a lavorare con un puntatore, ma qui finisce il terreno comune.

La mia mente curiosa e le mie mani birichine mi hanno tenuto occupato per due giorni e due notti

Ho provato a rimuovere l'oggetto creato dinamicamente fuori dall'ambito - nella funzione, metodo groping, ma alla fine ho ottenuto la soluzione:

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* &t)
{
   delete t;
}

che lo cancella, ma non riesco a capirlo così.... e non ho trovato nessuna firma di funzione simile per passare i puntatori


Ecco un'altra domanda:

come posso restituire un puntatore a un oggetto per riferimento come risultato di una funzione?

Voglio fare qualcosa del genere:

CTest ret_CTest()
{
   CTest *result = new CTest;
   return(result);
}


è possibile restituireCTest * senza problemi, ma come ho scritto ret_CTest() - dà un errore

 
Igor Makanu:

Due giorni e due notti la mia mente curiosa e le mie mani birichine mi hanno tenuto occupato

provato a rimuovere l'oggetto creato dinamicamente fuori dall'ambito - nella funzione, metodo gut feeling, ma alla fine sono arrivato alla soluzione:

che lo cancella, ma non riesco a capirlo così.... e non sono riuscito a trovare nessuna firma di funzione simile per il passaggio di puntatori in help o sat

Cosa vuol dire che è fuori portata? L'hai passato in una funzione, quindi è visibile lì)

s.s.void deleteCTest(CTest* &t) senza quel & dovrebbe funzionare anche, giusto?

Per rimuoverlo davvero al di fuori dell'ambito in cui è stato creato, e possibilmente in modo automatico, è necessario... shh... prima che qualcuno senta... Pattern Factory... leggere più velocemente e cancellare...

 

Igor Makanu:


ma come restituire un puntatore a un oggetto per riferimento come risultato di una funzione?

si può restituireCTest * senza problemi, ma come ho scritto ret_CTest() - dà un errore
Se volete il kosher
CTest& Foo();
, non ancora, ma se è così:
CTest Foo();

Se una classe ha un costruttore di copia, allora dovrebbe avere un costruttore di copia.

CTest(CTest &other)...
 
Aleksey Mavrin:

s.w.void deleteCTest(CTest* &t) senza questo & dovrebbe funzionare anche, o no?

controlla, imparerai qualcosa di nuovo ;)

Ho scritto molte volte che i puntatori MQL sono una cosa molto istruttiva ))))


Vladimir Simakov:
Se vuoi il kosher, non ancora, ma se è così:

Se volete usare un puntatore, la classe deve avere un costruttore di copia.

Di nuovo, ho bisogno di pensare

Ho il sospetto che GetPointer() possa fare qualche trucco... ma non è un fatto.... Questi "salti nello spazio e nel tempo" - tramite puntatore e dereferenziazione implicita in MQL - sono fuori di testa! (((

 
Igor Makanu:

controlla, imparerai molto ;)

Ho scritto molte volte che i puntatori in MQL sono una cosa molto istruttiva ))))

Cancella i puntatori ma non può assegnare un nuovo valore a _test. A proposito, MQL non ha niente a che fare con questo)))

 
Igor Makanu:

controlla, imparerai molto ;)

Vi ho detto più e più volte che i puntatori in MQL sono molto istruttivi ))))


Di nuovo, ho bisogno di pensare

Ho il sospetto che GetPointer() possa fare qualche trucco... ma non è un fatto.... Questi "salti nello spazio e nel tempo" - tramite puntatore e dereferenziazione implicita in MQL - sono fuori di testa! (((

Va bene qui)))) Basta spegnere lo sharpe, non c'è nemmeno un accenno qui))))

 
Igor Makanu:

controlla, imparerai molto ;)

Vi ho detto più e più volte che i puntatori in MQL sono molto istruttivi ))))

Ho controllato. Si cancella bene senza &)

Ho provato in MT4 e MT5 e confrontare)

class CTest
{
public:
   CTest() { Print(__FUNCTION__); }
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest();
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* t)
{
   delete t;
}
 
Aleksey Mavrin:

Ben controllato. Si cancella perfettamente senza &)

Ho provato in MT4 e MT5 e confrontare)

Non è un esempio completo, l'ho incontrato oggi.

Non funzionerà senza & .

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
   delete _test;
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* & t)
{
   delete t;
   t = new CTest;
}
//+------------------------------------------------------------------+

Vladimir Simakov:

Sto bene qui))) Non sono alla ricerca di sharps ma sono sicuro che funzionerà senza &)).


Non sto cercando Sharp, ho ancora a che fare con MQL, posso chiedere ciò che non capisco.

 
Igor Makanu:

Non è un esempio completo, mi ci sono imbattuto oggi.

non funzionerà così senza &

Certo che lo farà. State passando un puntatore per valore, quindi verrà creata una copia del puntatore. Lo userete per inchiodare l'oggetto e creare un nuovo oggetto per il puntatore che è stato creato nella funzione. Questo è c++, benvenuto))))
 
Igor Makanu:

non un esempio completo, mi sono imbattuto oggi

non funziona senza &



Secondo me, non ha niente a che vedere con i riferimenti, ma solo con il fatto che l'argomento della funzione deve essere passato per puntatore se volete che salvi il valore dopo l'esecuzione della funzione. Lo stesso accadrà con un file o un handle di indicatore, per esempio, che non sono riferimenti.

Questo è sempre stato lo standard in C++, anche se è passato molto tempo da quando lo ricordo vagamente.