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에 대해 알고 싶었지만 물어보기가 두려웠던 모든 것입니다)))

이 코드는 내 터미널을 쫓아냅니다. 기껏해야 디버깅에 치명적인 오류가 발생합니다(애니메이션을 보려면 그림 클릭).


컴파일러가 그러한 구성을 건너뛰는 것은 이상합니다.

 
얘들아, 특히 갑자기 말다툼을하지 마라.
Dmitry는 오류가 있는 첫 번째 예를 제시했는데 무엇이 잘못되었습니까?
Dim, 네, 오류 없이 컴파일되지만 스크립트를 실행하면 오류가 발생합니다.

Vladimir는 그것을 수정하고 포인터를 추가했는데 코드가 올바르게 작동했습니다.
다른 무엇을합니까? 이제 누가 가장 멋진 고추인지 분류해 볼까요? ))))
여러분, 서로를 존중하고 오만함으로 인신공격과 모욕을 받지 마십시오.

Dmitry의 초기 예
 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);
}
내 의견으로는 이러한 논쟁의 입력으로 컴파일러 오류가 드러났습니다.
컴파일러가 Dmitry의 초기 예제에서 오류 없이 컴파일을 건너뛰는 이유는 무엇입니까?
 
Vasiliy Sokolov :

이 코드는 내 터미널을 쫓아냅니다. 기껏해야 디버깅에서 치명적인 오류가 발생합니다.

컴파일러가 그러한 구성을 건너뛰는 것은 이상합니다.

컴파일러의 경우 모든 것이 여기에서 유효합니다.

프로그램의 데이터 세그먼트에 있는 개체에 대한 포인터가 생성되었으며 컴파일하는 동안 0x0으로 초기화되었습니다.

프로세서에 필요한 명령은 코드 세그먼트에서 생성됩니다.

실행하는 동안 함수 z(...)의 주소에 있는 명령이 스택에 푸시됩니다.

그리고 거기에서 rdx [0x0]을(를) 이동합니다.

그리고 제로 메모리 주소에 대한 액세스는 금지됩니다. 널 포인터 역참조가 호출됩니다.

 
Vladimir Simakov :
컴파일러의 경우 모든 것이 여기에서 유효합니다.

어떤 컴파일러를 위해?

 
Vasiliy Sokolov :

이 코드는 내 터미널을 쫓아냅니다. 기껏해야 디버깅 시 치명적인 오류가 발생합니다(애니메이션을 보려면 그림을 클릭하십시오).


컴파일러가 그러한 구성을 건너뛰는 것은 이상합니다.

그리고 그것은 나를 위해 컴파일되고 올바르게 작동하지만 작업이 완료되면 메모리 누수에 대한 메시지가 표시됩니다(삭제가 작동하지 않음).

 
Igor Makanu :

이제 당신이 그에게 나쁜 것을 가르친다면 그것을 알아내는 것이 좋을 것입니다)))

 #define private protected

당신이 fxsaber 코드와 함께 앉아 있었던 것은 당연합니다. 나에게 이것은 걸작이다.

 

잘못된 정보에 대해 사과드립니다. 이전에 자식 클래스에서 Create() 메서드를 호출하는 것이 불가능하다고 썼습니다.

지금 확인해보니 가능합니다. 그러나 비공개 멤버 m_button에 대한 액세스는 사용할 수 없었습니다. 저것들. 예를 들어 버튼의 상태 를 확인하는 것은 불가능했습니다.

Igor의 힌트로 이제 가능합니다.

 #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
}