エラー、バグ、質問 - ページ 2709

 
Stanislav Korotky:

MQLでファクトリーメソッドからプロテクトされたコンストラクタを呼び出すことができないのはなぜですか?

問題はデフォルトの値で、これを削除すればすべて元通りに動作します。

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

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

MQLでは、なぜファクトリーメソッドからプロテクトされたコンストラクタを呼び出すことができないのですか?

それがどこで役に立つのか、まだ推測できていません。

 
fxsaber:

どこで役に立つのか、想像がつかない。

Singletonパターンの古典的な実装。

 
Sergey Dzyublik:

Singletonパターンの古典的な実装です。

では、あるクラスのオブジェクトを一定数以上作成することはできないのですね。

 
fxsaber:

あるクラスのオブジェクトを一定数以上作れないようにするためですか?

そうです。プログラムのすべての部分から、状態を変更できるクラスのインスタンスへのアクセスポイントが1つになるようにします。
今日見つけた、絵と擬似コードのパターンに関するクールなサイトを紹介します: https://refactoring.guru/ru/design-patterns/singleton

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

そう、プログラムのすべての部分から、状態を変化させるクラスインスタンスへのアクセスポイントを1つにするためです。
今日見つけた、絵と擬似コードのパターンに関するクールなサイトを紹介します: https://refactoring.guru/ru/design-patterns/singleton

了解です、ありがとうございます。以前、このような構造を使ったことがあります。

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:

問題はデフォルト値で、これを削除すればすべて元通りに動作します。

しかし、C++では、デフォルト値でも動作する。どのような影響があるのでしょうか?

 

MQLのCryptEncode(CRYPT_ARCH_ZIP, data[], key[] = {1,0,0,0}, result[]をwebsocketからdeflate圧縮でフックした方はいらっしゃいますか。公開されているechoサーバ(echo.websocket.org)はこの拡張に対応していないようで、他のechoサーバは見つからず、ローカルのnode.jsでは圧縮データを復号しようとすると「zlib invalid distance too far back」というエラーが発生するようです。ヘッダーでserver_max_window_bits=15; client_max_window_bits=15を設定しましたが、サーバーがこれらの設定を確認するため、そうではないようです。MQL側では{1,0,0,0}キー以外設定できない;-(.

 
Stanislav Korotky:

MQLのCryptEncode(CRYPT_ARCH_ZIP, data[], key[] = {1,0,0,0}, result[]をwebsocketからdeflate圧縮でフックアップした方はいらっしゃいますでしょうか。公開されているechoサーバ(echo.websocket.org)はこの拡張をサポートしていないようで、他のechoサーバも見つからず、ローカルのnode.jsでは圧縮データを復号しようとすると「zlib invalid distance too far back」というエラーが出ます。ヘッダーでserver_max_window_bits=15; client_max_window_bits=15を設定しましたが、サーバーがこれらの設定を確認するため、そうではないようです。MQL側では{1,0,0,0}キー以外設定できない;-(.

ご質問の内容を正しく理解すると、GZIP圧縮は主にデータのパッケージングのためにwebsocketで使用されています。
CRYPT_ARCH_ZIP定数は、通常のZIPにパックされる可能性が高いです。
mql5を使ったGZIPのpack/unpackの方法をご存知の方、私も興味があります。

 
Roman:

私が質問を正しく理解していれば、ウェブソケットは主にGZIP圧縮を使用してデータをパックします。
CRYPT_ARCH_ZIP定数は、通常のZIPにパックされる可能性が高いです。
mql5のツールを使ってGZIPをパックしたりアンパックしたりする方法を知っていれば、私も興味があります。

私の知る限り、スイッチ {1,0,0,0} はすべてのラッピングを除去し、圧縮されたパッケージのみを残します。少なくとも "Hello "という単語は、CryptEncodeの 出力とdeflateの出力で同じように圧縮された形で表示されます。したがって、その逆もしかりです。しかし、MQLはこれ以上の設定を与えず、deflateが使用する「デフォルト」設定も表示しません。明らかに異なるが、max_window_bits と no_context_takeover だけがウェブソケットで制御できる。第一に、これらは明らかに deflate アルゴリズム (サーバーで設定される) よりも少なく、第二にこれらでさえ CryptEncode/Decode で設定することができない。