Libreria di classi generiche - bug, descrizione, domande, caratteristiche d'uso e suggerimenti - pagina 25
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Ma perché creare collezioni e metterle in un kodobase se sono buone solo per i tipi incorporati)?
Non vanno bene neanche per le strutture incorporate.
Ditemi, forse non capisco qualcosa, ma se cerco di usare una costruzione di questo tipo:
Ricevo un errore:
'Option' - gli oggetti sono passati solo per riferimento ICollection.mqh 14 18
e dopo c'è un'intera pila di errori...Questo non funzionerà, attraverso un modello di template bisogna fare, ho anche lavorato con questo problema, ecco un esempio di test, sembra funzionare correttamente
classe CData - struttura che vogliamo memorizzare nella lista
CDataBase - la lista stessa
In OnStart() - creare una lista, scriverci dei valori e poi leggerli. Lo controllo 2 volte, perché all'inizio da qualche parte ho perso la visibilità di una variabile locale quando scrivevo nella lista - scrivevo tutto ok, ma quando leggevo, poi ottenevo puntatori nulli e un errore
Non funzionerà in questo modo, devi usare template di modelli, anche io ho avuto a che fare con questo problema, ho fatto un esempio di test, tutto sembra funzionare correttamente
classe CData - la struttura che vogliamo memorizzare nella lista
CDataBase - la lista stessa
In OnStart () - creare una lista, scriverci dei valori e poi leggerli. Lo controllo due volte, perché prima ho perso da qualche parte la visibilità di una variabile locale quando scrivevo nella lista - stavo scrivendo tutto ok, ma quando leggevo, poi ho ottenuto puntatori nulli e un errore
Il tuo codice funziona perché CData è ancora una classe, non una struttura. Se cercate di usare il generatore per classi e strutture contemporaneamente, avrete problemi, specialmente con l'operatore di cancellazione. Ne sono stato convinto attraverso i miei esperimenti con questo "generico". Il punto è che questa libreria "generica" non ha affatto un operatore di cancellazione e se si aggiunge una nuova classe a tale "collezione", dopo l'uscita dal programma ci saranno molti oggetti persi. Cioè è ovvio che originariamente questo generico è stato scritto solo per i tipi primitivi.
Questo codice funziona perché CData è una classe, non una struttura. Se provate ad usare i generici per le classi e le strutture allo stesso tempo, incontrerete immediatamente dei problemi, specialmente con l'operatore di cancellazione. Ne sono stato convinto attraverso i miei esperimenti con questo "generico". Il punto è che questa libreria "generica" non ha affatto un operatore di cancellazione e se si aggiunge una nuova classe a tale "collezione", dopo l'uscita dal programma ci saranno molti oggetti persi. Cioè potete vedere che originariamente questo generico è stato scritto solo per i tipi primitivi.
Ho smesso di usare le strutture in MQL, la struttura non ha vantaggi, ma i costanti bug e la perdita di tempo mentre si lavora con le strutture che forniscono - ho letto i vecchi post degli amministratori con domande sulle strutture e in pratica dicevano di usare la classe invece della struttura - ora non uso affatto le strutture
SZZ: ho trovato questo quando ho smesso di usare le strutturehttps://www.mql5.com/ru/forum/6343/page866#comment_7541747
perché creare collezioni e metterle in un kodobase se sono buone solo per i tipi incorporati)?
Comodità che sono di serie. Quindi, non c'è bisogno di tirare - ogni utente ne ha uno.
Lo uso in uno dei miei libretti di KB per molto tempo.
Non funzionerà in questo modo, devi usare template di modelli, anche io ho avuto a che fare con questo problema, ho fatto un esempio di test, tutto sembra funzionare correttamente
classe CData - la struttura che vogliamo memorizzare nella lista
CDataBase - la lista stessa
In OnStart () - creare una lista, scriverci dei valori e poi leggere, 2 volte lo controllo, perché all'inizio da qualche parte ho perso la visibilità di una variabile locale quando scrivevo nella lista - scrivevo tutto ok, ma quando leggevo, poi ho avuto dei puntatori nulli letti e ho avuto un errore
Beh, prima di tutto hai implementato il tuo allocatore su una lista e memorizzi i puntatori lì. Non solo, si ha una perdita quando si distrugge).
Secondo, avresti dovuto usare correttamente il costruttore di copia invece dell'operatore di assegnazione. Ma tutto questo è IMHO)
E soprattutto: gli sviluppatori devono solo finalizzare i generici, rendere gli allocatori all'interno e supportare gli oggetti personalizzati. C++ ha già inventato tutto per loro) E non dobbiamo inventare le biciclette.
Beh, prima di tutto avete implementato il vostro allocatore su una lista e memorizzate lì i puntatori. Non solo, hai perdite sulla distruzione)
Come avete rilevato le perdite?
SZZ: è un esempio di test, dovevo capire come lavorare con le liste in MQL, così ho fatto dei test.
E soprattutto: gli sviluppatori dovrebbero solo finire i generici, fare allocatori all'interno e supportare gli oggetti personalizzati. C++ ha già inventato tutto per loro) E non dobbiamo inventare le biciclette.
Scrivilo se è così semplice.
come sono state individuate le perdite?
ZS: è un esempio di test, dovevo capire come lavorare con le liste in MQL, così ho fatto dei test.
Si creano copie di oggetti in AddValue tramite new, ma non li si libera nel distruttore, si cancella solo la lista dei puntatori.
scrivere se è così semplice.
Quando avrò il tempo e il bisogno, scriverò. E in generale, come esempio, creare una propria fabbrica di cuscinetti non è una buona idea se si ha bisogno di un solo modello di cuscinetto)