MQL5中的OOP问题 - 页 48

 
Alexey Navoykov:
最主要的是,它应该比C++更高级,其中的代码应该更简单、更简洁。 但事实上恰恰相反,MQL中的代码更繁琐、更笨拙。 你必须压缩大量的东西。
它让我想起了WinApi的感觉)))
 

有谁能告诉我们如何移植到MQL。

https://ru.wikipedia.org/wiki/Хранитель(设计模式)/非常规的C++版本的模式

正面试过,前方描述出了问题

//+------------------------------------------------------------------+
class Originator
{
public:
   int state;
   Originator() : state(0)    {                             }
   class Memento;
   Memento* getMemento();
   void setState(int s)       { state = s;                  }
   void dumpState()           { printf("State: %i", state); }
   class Memento
   {
   public:
      class Originator;
      int state;
      Originator* org;
      Memento() : state(0)    {                             }
      void restoreState();
   };
};
//+------------------------------------------------------------------+
Originator::Memento* Originator::getMemento()
{
   Originator::Memento* m = new Originator::Memento();
//   m.org = this;
//   m.state = state;
//   m->org = this;
//   m->state = state;
   return m;
}
//+------------------------------------------------------------------+
void Originator::Memento::restoreState()
{
//   org->state = state;
}
//+------------------------------------------------------------------+
void OnStart()
{

}
//+------------------------------------------------------------------+
 
Igor Makanu:

有谁能告诉我们如何移植到MQL。

https://ru.wikipedia.org/wiki/Хранитель(设计模式)/C++模式的非标准版本

正面试过,前方描述出了问题

我的版本。

//+------------------------------------------------------------------+
class Originator
  {
public:
   int               state;
                     Originator() : state(0)    {                             }
   class             Memento;
   Memento*          getMemento();
   void              setState(int s)       { state = s;                  }
   void              dumpState()           { printf("State: %i", state); }
   class Memento
     {
   public:
      //class          Originator;
      int            state;
      Originator*    org;
                     Memento() : state(0)    {                             }
      void           restoreState();
     };
  };
//+------------------------------------------------------------------+
Originator::Memento* Originator::getMemento()
  {
   Originator::Memento* m = new Originator::Memento();
   m.org = GetPointer(this);
   m.state = state;
   return m;
  }
//+------------------------------------------------------------------+
void Originator::Memento::restoreState()
  {
   this.state = state;
  }
//+------------------------------------------------------------------+
void OnStart()
  {
   Originator org_obj;
   Originator::Memento* ptr_mem_obj = org_obj.getMemento();
   delete ptr_mem_obj;
  }
//+------------------------------------------------------------------+
 
Denis Kirichenko:

我的版本。

很好!好的例子

谢谢你!

 
Alexey Navoykov:
最主要的是,它应该比C++更高级,其中的代码应该更简单、更简洁。 但事实上恰恰相反,MQL中的代码更繁琐、更笨拙。 很多事情都要拐弯抹角。

不,那是一个简短的笑话)。也许你在生活中选错了专业,也许你应该去读烹饪技术学校。

 
Alexey Navoykov:
其实,MQL是什么语言并不重要,主要是它应该比C++更高级,其中的代码应该更简单、更简洁。 但事实上恰恰相反,MQL中的代码更加繁琐、笨拙。 很多东西都要拐弯抹角地操作。

这里的主要问题是移植本身,甚至不是一般的移植,而是你如何能达到这样一个想法。

 

这就是心智不成熟的儿童学习STL的后果。

而MQL--它的创造者正好完美地表明,他们比任何人都更了解程序员的实际问题和编程的挑战。如果你不明白,也许你真的应该考虑一下烹饪技术学校?

MQL中的主要问题,也是唯一的问题,是思考如何确保策略的可靠执行的算法。这根本不是一个语言问题。任何语言或语法都不能单独提供这一点。这就是为什么你在句法层面上的打探是一个光明的证明,你仍然处于幼儿园的水平。那就是你甚至还没有学会如何编码,没有达到开发稳定算法的阶段。但至少你已经有...一整车的人。

 
Igor Makanu:

很好!很好的例子

谢谢你!

class Originator
  {
   int               state;
public:
   class Memento;
   Originator() : state(0){}
   Memento*          getMemento()      {return new Memento(&this);}
   void              setState(int s)   {state=s;}
   int               State()           {return state;}
   void              dumpState()       {printf("State: %i", state);}
///////////////////////////////////////////////////////////
   class Memento{
      int            state;
      Originator*    org;
      public:
                        Memento(Originator* mOrg):state(mOrg.State()),org(mOrg){}
         void           restoreState() {org.setState(state);}
   };
///////////////////////////////////////////////////////////
  };

void OnStart()
  {
   Originator org_obj;
   Originator::Memento* ptr_mem_obj = org_obj.getMemento();
   org_obj.setState(6);
   org_obj.dumpState();
   ptr_mem_obj.restoreState();
   org_obj.dumpState();
   delete ptr_mem_obj;
  }

这似乎是正确的

 
Vladimir Simakov:

这似乎是正确的方式

好的,我会保存它,我需要测试工作原理,也许这就是我所寻找的--为测试者和工作中的EA提供一个代码,它可以保存其状态,相反,在测试者中不要在 "额外的手势 "上浪费资源--这种模式的一部分可以由#ifdef -ami涵盖;)

 

模式单一,当然如果有人需要的话。

class Alone{
private:
   int state;        
   Alone():state(0){}
public:
   static Alone* Get(){
      static Alone alone;
      return &alone;}
   int State() {return(state);}
   void State(int _state) {state=_state;}
};

void OnStart()
  {
   Test(123);
   Alone* test=Alone::Get();
   Print(test.State());
  }
  
void Test(int x){
   Alone* test=Alone::Get();
   test.State(x);}

我一直渴望有一个好的,因为啤酒)))。

越来越老了,我想))))