MQL5中的OOP问题 - 页 14

 
TheXpert:

也是由版主保管的

谁说过关于监护权...但一个有两个古怪的人物...

 
TheXpert:

也是在版主的指导下

我以为我删除了自己的帖子。
 
Vladimir Simakov:
我似乎已经删除了自己的帖子。

这是在一个函数中通过new创建一个对象时的情况。最初,我们谈论的是传递一个指向现有对象的指针。而在这里,可以像这样通过。

空白f(CObj * obj){}。

 
Dmitry Fedoseev:

而如果一个指针需要传递给一个函数,以便在该函数中创建一个对象,这就是它的作用。

class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;

void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){
   o = new CObj();
}
这就是你想知道的关于OOP的一切,但却不敢问))

这段代码为我踢出了终端。在最好的情况下,它在调试中会导致一个关键的错误(关于动画点击图片)。


奇怪的是,这样的结构会被编译器跳过。

 
伙计们,不要再自相残杀了,尤其是在公平竞争的环境下。
德米特里给出的第一个例子有一个错误,这有什么错呢?
Dim,是的,它的编译没有错误,但当你运行脚本时,出现了一个错误。

Vladimir纠正了它,并添加了一个指针,代码正常工作。
我们还需要什么?现在我们必须找出谁是最酷的?))))
伙计们,要相互尊重,不要以傲慢的态度诉诸于人格和侮辱。

迪米特里的最初例子
class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;


void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){     //тут пропущен указатель
   o = new CObj();
}
弗拉基米尔的更正。
void z(CObj* &o){    //добавлен указатель
   o = new CObj();
}
我的更正与方法结果的打印,以验证
这个例子现在已经工作了,你还需要什么呢?
不要再试图找出谁更酷或不酷,每个人都有错别字和错误。
class CObj
{
   public:
   int f(){return(33);}
};

void z(CObj* &o)
{
   o = new CObj();
   Print(o.f());
}

CObj * obj;

//+------------------------------------------------------------------+
void OnStart()
{      
  z(obj);
  delete(obj);
}
在这些争论的过程中,我想我们已经发现了一个编译器错误。
为什么编译器跳过编译Dmitri的初始例子而没有错误?
 
Vasiliy Sokolov:

这段代码为我踢出了终端。在最好的情况下,它会导致一个关键的 调试错误

很奇怪,这样的结构会被编译器通过。

这里的一切对编译器都是有效的。

一个指向程序数据段中的对象的指针被创建,在编译过程中被0x0启动。

对处理器的必要命令是在代码段中创建的。

在运行时,命令在堆栈中的z(...)函数的地址处被提出。

并有移动rdx [0x0]。

而访问一个空的内存地址是被禁止的。对空指针的解除引用被称为

 
Vladimir Simakov:
这里的一切对编译器都是有效的。

对于哪个编译器?

 
Vasiliy Sokolov:

这段代码为我踢出了终端。在最好的情况下,它在调试中会导致一个关键的错误(关于动画点击图片)。


奇怪的是,这样的结构会被编译器跳过。

我的编译,工作正常,但完成后显示内存泄漏(删除不工作)信息。

 
Igor Makanu:

你现在会教他坏的东西,需要处理的是好的东西))。

#define private protected

你的fxsaber代码不是白坐的。在我看来,这听起来像是一部杰作。

 

为错误的信息道歉,我之前写的是你不能在子类中调用Create()方法。

现在经过反复检查,可以了。但对私人成员m_button的访问是不可用的。例如,它不可能检查,例如,按钮的状态: 已按下/已释放。

现在有了伊戈尔的暗示,就有可能了。

#define private protected
#include <Controls\Button.mqh>

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

void CMyButton::setButton(void)
{
  // метод Create() вызывается
   Create(0, "setBtn", 0, 50, 300, 150, 325);
   Text("setBtn");
   
   m_button.State();     // работает когда включаем #define private protected
}