MQL5中的OOP问题 - 页 12

 
Vasiliy Pushkaryov:

关于另一个问题的建议。如果你从CButton创建一个子类CMyButton,你可以创建一个按钮,然后在类外改变它的属性。下面的工作是在OnInit()中完成的。

但是,如果我想在子类里面做额外的字段,并在新的函数中使用CButton类的内置属性,我怎样才能正确地做到这一点?

CButton类中,m_button类成员被声明在private部分。

我无法进入父类的私有部分。

也许我们可以保持简单明了--看看CButton类中的图形对象的名称是如何形成的,并直接与这些图形对象一起工作。对于一个按钮来说更是如此,它应该很容易,它只有一个图形对象。

 
TheXpert:

是的,已经有两个不相干的人在对你的代码进行照相了 )

你的代码不能正常工作--从代码本身就可以看出)。

两个人?出于你的想象力,是吗?你至少应该更仔细地阅读,或者至少更仔细地看一下图片。第一条信息是来自调试器。它可以在没有调试器的情况下编译和工作。

 
Dmitry Fedoseev:

两个人?从你的幻想中,嗯?你应该更仔细地阅读,或者至少更仔细地看一下图片。第一条信息是来自调试器。在没有调试器的情况下,它可以编译和工作。

我在没有调试器的情况下让它崩溃了)。

在调试器中也会崩溃))

也许你只是不知道在哪里可以看到脚本的输出日志?)))

 
TheXpert:

我没有调试器就崩溃了)

我在调试器中也是峰回路转)。

也许你只是不知道在哪里可以看到脚本的输出日志?)))

不,我不知道,告诉我它在哪里。

 
Vasiliy Pushkaryov:

关于另一个问题的建议。如果你从CButton创建一个子类CMyButton,你可以创建一个按钮,然后在类外改变它的属性。下面的工作是在OnInit()中完成的。

但是,如果我想在子类里面做额外的字段,并在新的函数中使用CButton类的内置属性,这怎么能正确实现呢?

CButton类中,m_button类的成员被声明在私有部分。

我认为你又在从 "尾巴 "方面解决你的问题,我建议从另一个方面解决这个问题。

class CMyButton : public CButton
{ 
  private: 
   CButton        *mybtn;
  public: 
              CMyButton(void){}; 
             ~CMyButton(void){}; 
             
        bool    isPrevState;        // состояние кнопки на предыд.тике, true - была нажата     
        void    setButton();        // создаем кнопку
        void    setProp();          // задаем в ходе программы свойства
}; 

void CMyButton::setButton(void)
{
  mybtn = new CButton;
  mybtn.Create(....................);
  // как в этой функции создать кнопку? Я не могу вызвать метод Create()


德米特里-费多塞耶夫

你不能进入父类的私有部分。

你至少可以用#define进入,你可以用dynamic_cast做实验。 去年我研究了dynamic_cast,它做的事情很惊人,但这是一个耗时的过程。


TheXpert

我在没有调试器的情况下得到了它 )

检查 - 我也得到了:2019.07.05 17:10:27.307 1 (EURUSD,H1) invalid pointer access in '1.mq5' (43,6)

 

而你让我很感兴趣,所以我想也许我真的是你认为的那个白痴。我挖出了我五年前写的一些代码,这里有一个片段。

因此,你可以保持...喷出你的...所有你想要的......并梦想我是个白痴,但到目前为止,情况恰恰相反。你们像疯魔一样跳来跳去,也没有用。

***

而对于我的那段代码,尽管它可以编译和工作,但很快就会发现它有问题了。该对象没有通过删除而被删除。

但你喜欢相信,我甚至不知道什么是:CObj obj;继续相信吧......

***

但他们准备把耳朵冻到脚跟上,"以报复他们的祖父"。甚至他们的垃圾收集器也出现在MQL中。

 
Dmitry Fedoseev:

但你让我很感兴趣,所以我想也许我真的是你认为的那个白痴。我挖出了我五年前写的一些代码,这里有一个片段。

因此,你可以保持...喷出你的...所有你想要的.........并管我是个白痴,但到目前为止,情况恰恰相反。

在这里,一切都很正确,引用是指向一个指针,而引起大惊小怪的是指向一个不存在的对象的引用。仔细看一下代码。
 
Vladimir Simakov:
这里所有的东西都是正确的,指针被引用了,而使整个争斗的是对一个不存在的对象的引用。仔细查看代码。

你真的认为我不能注意到在一个地方有一个*,在另一个地方有一个*&吗?

你也相信我不知道CObj obj; 是什么吗

 
Vladimir Simakov:
...对一个不存在的对象的引用...

但它可以编译和工作。

 
Dmitry Fedoseev:

你真的认为我不能注意到在一个地方有一个*,在另一个地方有一个*&吗?

你也相信我不知道CObj obj; 是什么吗

你做到了。
void z(CObj & o){
   o = new CObj();
}