Fehler, Irrtümer, Fragen - Seite 2709

 
Stanislav Korotky:

Warum kann ich einen geschützten Konstruktor nicht von meiner Fabrikmethode in MQL aufrufen?

Das Problem ist der Standardwert. Wenn Sie ihn entfernen, funktioniert alles wie gewünscht:

class A1
{
  protected:
    A1(const bool x = false){}
  public:  
    static A1 *creator()
    {
      return new A1(true);
    }
};

void OnStart()
{
  A1 *a = A1::creator();
}
 
Stanislav Korotky:

Warum können Sie in MQL einen geschützten Konstruktor nicht von Ihrer Fabrikmethode aus aufrufen?

Ich habe nicht erraten, wo das nützlich sein könnte.

 
fxsaber:

Ich habe noch nicht erraten, wo das nützlich sein könnte.

Klassische Implementierung des Singleton-Musters.

 
Sergey Dzyublik:

Eine klassische Implementierung des Singleton-Musters.

Sie können also nicht mehr als eine bestimmte Anzahl von Objekten einer bestimmten Klasse erstellen?

 
fxsaber:

So dass nicht mehr als eine bestimmte Anzahl von Objekten einer bestimmten Klasse erstellt werden kann?

Ja, damit es einen einzigen Zugangspunkt von allen Teilen des Programms zu einer Instanz der Klasse mit veränderbarem Zustand gibt.
Hier ist eine coole Seite, die ich heute über Muster in Bildern und Pseudocode gefunden habe:https://refactoring.guru/ru/design-patterns/singleton

Одиночка
Одиночка
  • refactoring.guru
Одиночка — это порождающий паттерн проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. Проблема Одиночка решает сразу две проблемы, нарушая принцип единственной ответственности класса. Гарантирует наличие единственного экземпляра класса. Чаще всего это полезно для...
 
Sergey Dzyublik:

Ja, um einen einzigen Zugangspunkt von allen Teilen des Programms zu einer zustandsändernden Klasseninstanz zu haben.
Hier ist eine coole Seite, die ich heute über Muster in Bildern und Pseudocode gefunden habe:https://refactoring.guru/ru/design-patterns/singleton

Verstanden, danke. Ich habe eine solche Konstruktion schon einmal verwendet.

template <typename T>
struct PTR
{
  T* Ptr;

  PTR( void ) : Ptr(NULL)
  {
  }

  PTR( T* ptr ) : Ptr(ptr)
  {
  }

  ~PTR( void )
  {
    if (this.Ptr)
      delete this.Ptr;
  }

  bool Set( T* ptr )
  {
    this.Ptr = ptr;

    return(true);
  }

  void operator =( bool )
  {
  }
};

class CLASS
{
private:
#define  THIS CLASS::sPtr.Ptr
  static PTR<CLASS> sPtr;

  CLASS( const bool x /* = false */ )
  {
  }
    
  static bool Set()
  {
    return(THIS ? false : CLASS::sPtr.Set(new CLASS(true)));
  }  
#undef  THIS  
};

// Создается скрытый объект CLASS со скрытым конструктором.
// Ни создать CLASS-объект, ни обратиться к существующему нельзя
static PTR<CLASS> CLASS::sPtr = CLASS::Set();
 
Sergey Dzyublik:

Das Problem ist der Standardwert. Wenn Sie ihn entfernen, funktioniert alles wie gewünscht:

Aber in C++ funktioniert es auch mit dem Standardwert. Wie wirkt sich das aus?

 

Hat jemand MQL's CryptEncode(CRYPT_ARCH_ZIP, data[], key[] = {1,0,0,0}, result[]) mit Deflate-Kompression von Websocket angeschlossen? Der öffentliche echo-Server (echo.websocket.org) scheint diese Erweiterung nicht zu unterstützen, ich habe keinen anderen echo-Server gefunden und das lokale node.js gibt die Fehlermeldung "zlib invalid distance too far back", wenn ich versuche, komprimierte Daten zu entschlüsseln. Ich habe server_max_window_bits=15; client_max_window_bits=15 im Header eingestellt, aber es scheint nicht der Fall zu sein, da der Server diese Einstellungen bestätigt. Auf der MQL-Seite kann ich nichts außer dem Schlüssel {1,0,0,0} einstellen ;-(.

 
Stanislav Korotky:

Hat jemand MQL's CryptEncode(CRYPT_ARCH_ZIP, data[], key[] = {1,0,0,0}, result[]) mit Deflate-Kompression von Websocket angeschlossen? Der öffentliche echo-Server (echo.websocket.org) scheint diese Erweiterung nicht zu unterstützen, ich habe keinen anderen echo-Server gefunden und das lokale node.js gibt die Fehlermeldung "zlib invalid distance too far back", wenn ich versuche, komprimierte Daten zu entschlüsseln. Ich habe server_max_window_bits=15; client_max_window_bits=15 in der Kopfzeile eingestellt, aber es scheint nicht der Fall zu sein, da der Server diese Einstellungen bestätigt. Auf der MQL-Seite kann ich nichts außer dem Schlüssel {1,0,0,0} einstellen ;-(.

Wenn ich Ihre Frage richtig verstanden habe, wird die GZIP-Komprimierung hauptsächlich in Websockets zur Datenpaketierung verwendet.
Die Konstante CRYPT_ARCH_ZIP verpackt höchstwahrscheinlich in reguläre ZIP.
Wenn Sie wissen, wie man GZIP mit mql5 packen/entpacken kann, bin ich auch interessiert.

 
Roman:

Wenn ich die Frage richtig verstehe, verwenden Websockets meist GZIP-Kompression, um Daten zu verpacken.
Die Konstante CRYPT_ARCH_ZIP packt höchstwahrscheinlich auf reguläre ZIP.
Wenn Sie wissen, wie man GZIP mit Hilfe von mql5-Tools packt/entpackt, bin ich ebenfalls interessiert.

Soweit ich weiß, werden mit dem Schalter {1,0,0,0} alle Umhüllungen entfernt und nur das komprimierte Paket belassen. Zumindest das Wort "Hello" erscheint in komprimierter Form in der CryptEncode-Ausgabe und in der Deflate-Ausgabe auf die gleiche Weise. Dementsprechend sollte es auch andersherum funktionieren. MQL gibt jedoch keine weiteren Einstellungen an und zeigt auch nicht die von Deflate verwendeten "Standardeinstellungen" an. Offensichtlich sind sie unterschiedlich, aber nur max_window_bits und no_context_takeover können im Websocket gesteuert werden - erstens sind sie deutlich geringer als beim Deflate-Algorithmus (der auf dem Server konfiguriert wird), zweitens können auch sie nicht in CryptEncode/Decode konfiguriert werden.