错误、漏洞、问题 - 页 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:

这样,就不能创建超过一定数量的某类对象?

是的,这样就有一个单一的访问点,从程序的所有部分到一个具有可改变状态的类的实例。
这是我今天发现的一个很酷的网站,关于图片和伪代码的模式:https://refactoring.guru/ru/design-patterns/singleton

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

是的,从程序的所有部分到一个状态变化的类实例有一个单一的访问点。
这是我今天发现的一个很酷的网站,关于图片和伪代码的模式: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-server(echo.websocket.org)似乎不支持这个扩展,我没有找到任何其他的echo-server,本地的node.js在试图解密压缩数据时给出了错误 "zlib无效距离太远"。我在头中设置了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-server(echo.websocket.org)似乎不支持这个扩展,我没有找到任何其他的echo-server,而本地的node.js在试图解密压缩数据时给出错误 "zlib无效距离太远"。我在头中设置了server_max_window_bits=15;client_max_window_bits=15,但似乎并不是这样,因为服务器确认了这些设置。在MQL方面,除了{1,0,0,0}键,我不能设置任何东西;-(。

如果我对你的问题理解正确,GZIP压缩主要用于websockets的数据打包。
CRYPT_ARCH_ZIP常数很可能包给了普通的ZIP。
如果你知道如何用mql5打包/解压GZIP,我也很感兴趣。

 
Roman:

如果我对这个问题理解正确的话,websockets大多使用GZIP压缩来打包数据。
CRYPT_ARCH_ZIP常数很可能包给了普通的ZIP。
如果你知道如何打包/解压GZIP,使用mql5工具,我也很感兴趣。

据我所知,开关{1,0,0,0}去掉了所有包装,只留下压缩包。至少 "Hello "这个词以压缩形式出现在CryptEncode 输出和deflate输出中的方式是一样的。相应地,它也应该反过来发挥作用。然而,MQL并没有给出更多的设置,也没有显示deflate所使用的 "默认 "设置。显然它们是不同的,但只有max_window_bits和no_context_takeover可以在websocket中控制--首先它们显然比deflate算法(在服务器上配置)要少,其次即使它们不能在CryptEncode/Decode中配置。