Generische Klassenbibliothek - Bugs, Beschreibung, Fragen, Nutzungsmöglichkeiten und Vorschläge - Seite 25

 
Andrey Pogoreltsev:

Warum sollte man Sammlungen erstellen und sie in eine kodobase stellen, wenn sie nur für eingebettete Typen gut sind?)

Sie sind auch nicht gut für eingebettete Strukturen.

 
Andrey Pogoreltsev:

Sagen Sie mir, vielleicht verstehe ich etwas nicht, aber wenn ich versuche, eine Konstruktion dieser Art zu verwenden:

Ich erhalte eine Fehlermeldung:

Option' - Objekte werden nur per Referenz übergeben ICollection.mqh 14 18

und dann gibt es einen ganzen Stapel von Fehlern...

Dies wird nicht funktionieren, durch eine Vorlage Vorlage tun müssen, arbeitete ich auch mit diesem Problem, hier ist ein Test-Beispiel, scheint es richtig zu funktionieren

Klasse CData - Struktur, die wir in der Liste speichern wollen

CDataBase - die Liste selbst

#property strict
#include <Arrays\List.mqh>

//+------------------------------------------------------------------+
class CData : public CObject
  {
public:
   int               x;
   double            y;
   datetime          t;
  };
//+------------------------------------------------------------------+
template<typename TDB>class CDataBase
  {
private:
   CList            *mlist;
   TDB              *TDBptr;
public:
   void CDataBase()           { mlist=new CList;                                       }
   void ~CDataBase(void)      { delete mlist;                                          }
   int ArraySize(void)        { return(mlist.Total());                                 }
   TDB *operator[](int index) { return(mlist.GetNodeAtIndex(index));                   }
   void  AddValue (TDB &value){ TDBptr = new TDB; TDBptr  = value; mlist.Add(TDBptr);  }
   string TypeName()          { return(typename(TDB));                                 }
   };
//+------------------------------------------------------------------+
// проверка, запишем  распринтуем значения
void OnStart()
  {

   CDataBase<CData>*data=new CDataBase<CData>;
   CData *my=new CData;

   int i;
   Print("1------------------------------------");
   for(i=0; i<10; i++)
     {
      my.x=i;
      my.y= i*2;
      data.AddValue(my);
      Print(i," : ",data[i].x," , ",data[i].y," / ",my.x," ,",my.y);
     }
   Print("2------------------------------------");
   for(i=0; i<data.ArraySize(); i++)
     {
      Print(i," : ",data[i].x," , ",data[i].y);
     }
   Print(data.TypeName());
   delete my;
   delete data;
  }
//+------------------------------------------------------------------+

In OnStart() - wir erstellen eine Liste, schreiben Werte in sie und lesen sie dann. Ich überprüfe es 2 Mal, weil ich zuerst irgendwo die Sichtbarkeit einer lokalen Variablen beim Schreiben in die Liste verlor - ich schrieb alles ok, aber wenn ich las, dann bekam ich Nullzeiger und einen Fehler

 
Igor Makanu:

Es wird nicht auf diese Weise funktionieren, müssen Sie Vorlagen Vorlage verwenden, war ich mit diesem Problem zu tun, habe ich ein Test-Beispiel, es scheint alles richtig zu funktionieren

Klasse CData - die Struktur, die wir in der Liste speichern wollen

CDataBase - die Liste selbst

In OnStart () - erstellen Sie eine Liste, schreiben Sie Werte in sie und lesen Sie sie dann. Ich überprüfe es zweimal, denn zuerst habe ich irgendwo Sichtbarkeit einer lokalen Variablen verloren, wenn ich in die Liste schreibe - ich schrieb alles ok, aber wenn ich las, dann bekam ich Null-Zeiger und einen Fehler

Ihr Code funktioniert, weil CData immer noch eine Klasse und keine Struktur ist. Wenn Sie versuchen, den Generator für Klassen und Strukturen gleichzeitig zu verwenden, werden Sie Probleme bekommen, insbesondere mit dem Löschoperator. Davon habe ich mich durch meine eigenen Experimente mit diesem "Generikum" überzeugt. Der Punkt ist, dass diese "generische" Bibliothek überhaupt keinen Lösch-Operator hat, und wenn man eine neue Klasse zu einer solchen "Sammlung" hinzufügt, gibt es nach dem Beenden des Programms eine Menge verlorener Objekte. D.h. es ist offensichtlich, dass diese Generik ursprünglich nur für primitive Typen geschrieben wurde.

 
Vasiliy Sokolov:

Dieser Code funktioniert für Sie, weil CData eine Klasse und keine Struktur ist. Wenn Sie versuchen, generisch für Klassen und Strukturen gleichzeitig zu verwenden, werden Sie Probleme bekommen, insbesondere mit dem Löschoperator. Davon habe ich mich durch meine eigenen Experimente mit diesem "Generikum" überzeugt. Der Punkt ist, dass diese "generische" Bibliothek überhaupt keinen Lösch-Operator hat, und wenn man eine neue Klasse zu einer solchen "Sammlung" hinzufügt, gibt es nach dem Beenden des Programms eine Menge verlorener Objekte. D.h. Sie sehen, dass diese Generika ursprünglich nur für primitive Typen geschrieben wurden.

Ich habe aufgehört, Strukturen in MQL zu verwenden, die Struktur hat keine Vorteile, aber die ständigen Bugs und Zeitverschwendung bei der Arbeit mit den Strukturen, die sie zur Verfügung stellen - ich lese die alten Admins 'Beiträge mit Fragen über die Strukturen und sie würden im Grunde sagen, verwenden Sie die Klasse statt der Struktur - ich benutze keine Strukturen überhaupt jetzt

SZZ: Das habe ich gefunden, als ich keine Strukturen mehr verwendetehttps://www.mql5.com/ru/forum/6343/page866#comment_7541747

Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2018.05.23
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Andrey Pogoreltsev:

Warum sollte man Sammlungen erstellen und sie in eine kodobase stellen, wenn sie nur für eingebettete Typen geeignet sind?)

Annehmlichkeiten, die zur Standardausstattung gehören. Daher ist es nicht nötig, zu ziehen - jeder Benutzer hat einen.

Ich verwende dies in einer meiner KB-Libs seit langem.

 
Igor Makanu:

Es wird nicht auf diese Weise funktionieren, müssen Sie Vorlagen Vorlage verwenden, war ich mit diesem Problem zu tun, habe ich ein Test-Beispiel, es scheint alles richtig zu funktionieren

Klasse CData - die Struktur, die wir in der Liste speichern wollen

CDataBase - die Liste selbst

In OnStart () - erstellen Sie eine Liste, schreiben Sie Werte in sie und dann lesen, 2 mal ich es überprüfen, weil zunächst irgendwo verlor ich Sichtbarkeit einer lokalen Variable beim Schreiben in die Liste - ich verwendet, um alles ok zu schreiben, aber wenn ich lesen, dann bekam ich Null-Zeiger lesen und bekam einen Fehler

Nun, zunächst einmal haben Sie Ihren Allokator über eine Liste implementiert und dort Zeiger gespeichert. Und nicht nur das: Sie haben ein Leck beim Zerstören).

Zweitens hätten Sie den Kopierkonstruktor anstelle des Zuweisungsoperators verwenden müssen. Aber das ist alles IMHO)

Und das Wichtigste: Entwickler müssen lediglich Generika finalisieren, Allokatoren einbauen und benutzerdefinierte Objekte unterstützen. C++ hat bereits alles für sie erfunden. Und wir müssen keine Fahrräder erfinden.

 
Andrey Pogoreltsev:

Nun, zunächst einmal haben Sie Ihren Allokator über eine Liste implementiert und speichern die Zeiger dort. Und nicht nur das, Sie haben auch undichte Stellen bei der Zerstörung)

Wie haben Sie undichte Stellen entdeckt?

SZZ: Es ist ein Testbeispiel, ich musste herausfinden, wie man mit Listen in MQL arbeitet, also habe ich Tests gemacht.

 
Andrey Pogoreltsev:

Und das Wichtigste: Entwickler sollten einfach die Generics beenden, Allokatoren einbauen und benutzerdefinierte Objekte unterstützen. C++ hat bereits alles für sie erfunden. Und wir müssen keine Fahrräder erfinden.

Schreiben Sie es, wenn es so einfach ist.

 
Igor Makanu:

Wie wurden die Lecks entdeckt?

ZS: Es ist ein Testbeispiel, ich musste herausfinden, wie man mit Listen in MQL arbeitet, also habe ich Tests gemacht.

Sie erstellen Kopien von Objekten in AddValue über new, aber Sie geben sie nicht im Destruktor frei, sondern löschen nur die Zeigerliste.

 
TheXpert:

schreiben, wenn es so einfach ist.

Wenn ich die Zeit und das Bedürfnis habe, werde ich schreiben. Und im Allgemeinen ist es keine gute Idee, eine eigene Lagerfabrik zu gründen, wenn Sie nur ein Lagermodell benötigen.)

Grund der Beschwerde: