MQL5中的OOP问题 - 页 3

 

如果所有的按钮一次只工作一行,那么在按钮类中创建一个静态变量 来引用这一行。但这是不合理的,因为它限制了按钮类的可能性--你不能创建两对按钮来并行处理两条线。

而这个问题的正确解决方法很简单--写一个函数,将行的引用传递给函数,函数将这个引用传递给所需的按钮对象。你不需要在OOP中寻求任何奇迹。

或者,你可以写一个类来创建两个按钮。

 
Dmitry Fedoseev:

如果所有的按钮一次只工作一行,那么在按钮类中创建一个静态变量 来引用这一行。但仅仅这样做是没有意义的,因为它限制了按钮类能做的事情--你不能创建两对按钮来并行处理两条线。

是的,我有四对按钮和四行,所以我也放弃了静态变量这个选项。

而这个问题的正确解决方法很简单:写一个函数,把行的链接传给函数,这个链接传给函数中想要的按钮对象。你不需要在OOP中寻求任何奇迹。

好吧,或者写一个类,创建两个按钮。

而我相信OOP的奇迹)。

谢谢你的这些选择,我会考虑哪一个最适合我。

 
Vasiliy Pushkaryov:

帮我解决一个问题。有两个按钮和一条线。一个按钮,当按下时,使该行进入编辑模式,当释放时,删除该行。 第二个按钮,当点击时,固定该行,当点击时,将其放回编辑模式。每个按钮都可以改变线条对象的 颜色和其他一些属性。"线 "对象是全局定义的。是否可以在创建按钮后立即将 "线 "对象的引用传递给每个按钮,这样当你在 "按钮 "对象内操作引用变量时,所有的变化都会被记在全局 "线 "对象中。

我在下面勾画了一个简化的脚本,而不是按一个按钮--addition()函数,它增加了 "Line "对象的计数器。我知道你可以通过引用来传递 "Line "对象作为函数参数,但只是在工作版本中,有几个这样的函数,所以我想在开始时传递一次引用。也就是说,是否可以让Btn1.addition()或Btn2.addition()增加gLine.count?

这就是我现在的做法。


也许这是个好办法?

//+------------------------------------------------------------------+
class CLine
  {
public:
   int               count;
                     CLine(void){count=0;};
                    ~CLine(void){};
  };
//+------------------------------------------------------------------+
class CMyButton
  {
private:
public:
   CLine            *m_Line;
                     CMyButton(void):m_Line(NULL){};
                    ~CMyButton(void){};

   void bind(CLine *aLine) {m_Line=aLine;}
   void addition() {if(CheckPointer(m_Line)==POINTER_DYNAMIC){++m_Line.count;}}
  };


CMyButton  Btn1;
CMyButton  Btn2;

CLine *gLine;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   gLine = new CLine;
   Btn1.bind(GetPointer(gLine));
   Btn2.bind(GetPointer(gLine));
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Print("Line.count=", gLine.count);
   Btn1.addition();
   Print("Line.count=", gLine.count, "  Btn1.m_Line.count=", Btn1.m_Line.count);
   Btn2.addition();
   Print("Line.count=", gLine.count, "  Btn2.m_Line.count=", Btn2.m_Line.count);
   Btn1.addition();
   Print("Line.count=", gLine.count, "  Btn1.m_Line.count=", Btn1.m_Line.count);
   Btn2.addition();
   Print("Line.count=", gLine.count, "  Btn2.m_Line.count=", Btn2.m_Line.count);
  }
//+------------------------------------------------------------------+

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

 
Igor Makanu:

也许这就是它应该有的样子?

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

是的,伊戈尔,就是这样,非常感谢你。

我仍然在指针方面 "摸索",因此你的解决方案将有助于我完成目前的任务,并进一步了解如何使用指针

谢谢你的反馈。

 
Igor Makanu:

也许这就是它应该有的样子?

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

如果你自己把gLine声明为一个指针,为什么还要使用GetPointer(gLine)?)))

在声明CLine对象时,人们还需要创建它。

CLine* gLine=new CLine;

按钮和行也需要在按钮初始化阶段被初始化。

...
                CMyButton(CLine* line):m_Line(!CheckPointer(line)?NULL:line){};
...
CLine* gLine=new CLine;
CMyButton  Btn1(gLine);
 
Vladimir Simakov:

如果你自己把gLine声明为一个指针,为什么还要使用GetPointer(gLine)?)))

形成CLine对象也是申报时的一项紧急任务。

CLine* gLine=new CLine;

按钮和行也应在按钮初始化阶段被初始化。

那是在晚上,不清楚我为什么这样写......其实我正在睡觉,手机上的Skype把我吵醒了,所以我只是在论坛上跳了一下 ))

说真的,我的例子是一个教程,我没有检查过,也许我在潜意识中过度保险,我没有完全理解MQL-指针是什么,它显然不像C++指针那样工作。

我一直在试图弄清楚,但我还没有弄清楚指针作为函数https://www.mql5.com/ru/forum/1111/page2470#comment_11796309 的参数是如何工作的--我在那里向函数传递了一个指针,但实际上我得到了一个新创建的指针的拷贝。

SZY: 我搞不清楚MQL-pointers有什么范围,我也问过https://www.mql5.com/ru/forum/1111/page2488#comment_12154218....我还是不明白哪些情况是局部范围,哪些是全局范围 ...总而言之,我是用科学的方法来处理MQL-指针的((())。


Vasiliy Pushkaryov:

是的,伊戈尔,就是这样,非常感谢。

我仍然在指针中 "游泳",这就是为什么你的解决方案对我目前的任务和进一步理解如何使用指针 会很有帮助。

谢谢你的反馈。

拜托!对于MQL指针,只有实践才会有帮助,它们有特殊的行为,正如@Vladimir Simakov 所写的,你的问题最有可能通过写一个带参数的构造函数来解决--我通常会这样做,从抽象的角度来看?- 这并不正确,但它很方便,而且总是能正确地工作--而且编译器不会让你忘记绑定指针。

如果(CheckPointer(m_Line)==POINTER_DYNAMIC)

这个检查可以省去,因为你在调用构造函数时无论如何都会保存指针。

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2019.05.22
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

哇,原来任务并不是要等待两个对象同时传递一个指针到一行。这实际上是在传递一个指针。谁会想到呢?

你不需要通过new来创建对象,就可以在某个地方传递一个指针。但是传递指针的类必须有一个指针变量(带星号*)。

 
Igor Makanu:

那是在晚上,天很黑--我为什么这样写......其实我在睡觉,手机上的Skype把我吵醒了,所以我顺便浏览了一下论坛 ))

说真的,我的例子是一个教程,我没有检查过,也许我在潜意识里已经投保了,我没有完全理解MQL-指针是什么,它显然不像C++指针那样工作。

我一直在试图弄清楚,但我还没有弄清楚指针作为函数https://www.mql5.com/ru/forum/1111/page2470#comment_11796309 的参数是如何工作的--我在那里向函数传递了一个指针,但事实上我得到了一个新创建的指针的拷贝。

SZY: 我搞不清楚MQL-pointers有什么范围,我也问过https://www.mql5.com/ru/forum/1111/page2488#comment_12154218....我还是不明白哪些情况是局部范围,哪些是全局范围 ...总而言之,我正在使用科学实验的方法来处理MQL-指针((())。

在第一种情况下,一切都很简单。你实际上在堆栈上创建了一个新的动态对象,仅此而已。你必须把它传到...(CObj* &jbj,...

而在第二种情况下,你必须这样做。

void  AddValue (T &value)  { Tptr  = value; mlist.Add(Tptr);       }
 
Vladimir Simakov:

对于第一种情况,这很简单。你实际上是在堆栈上创建一个新的动态对象,仅此而已。你应该把它传到...(CObj* &jbj,...

而在第二种情况下,你应该。

我今晚会检查的,参考资料没有给出很多关于使用&的信息。

谢谢你!

 
指针也可以通过非引用方式传递--没有&。