MQL5의 OOP에 대한 질문 - 페이지 3

 

모든 버튼이 한 번에 한 줄에서만 작동하는 경우 버튼 클래스에 해당 줄을 참조하는 정적 변수 를 만듭니다. 그러나 이것은 버튼 클래스의 가능성을 제한하기 때문에 합리적이지 않습니다. 두 줄의 병렬로 작동하는 두 쌍의 버튼을 만드는 것은 불가능합니다.

그리고 문제에 대한 올바른 해결책은 기본입니다. 함수를 작성하고, 라인에 대한 링크가 함수에 전달되고, 함수에서 이 링크가 필요한 버튼 객체에 전달됩니다. OOP에서 기적을 찾을 필요가 없습니다.

글쎄, 또는 두 개의 버튼을 생성하는 클래스를 작성하십시오.

 
Dmitry Fedoseev :

모든 버튼이 한 번에 한 줄에서만 작동하는 경우 버튼 클래스에 해당 줄을 참조하는 정적 변수 를 만듭니다. 그러나 이것은 버튼 클래스의 가능성을 제한하기 때문에 합리적이지 않습니다. 두 줄의 병렬로 작동하는 두 쌍의 버튼을 만드는 것은 불가능합니다.

네, 네 쌍의 버튼과 네 개의 라인이 있으므로 정적 변수도 옵션으로 버립니다.

그리고 문제에 대한 올바른 해결책은 기본입니다. 함수를 작성하고, 라인에 대한 링크가 함수에 전달되고, 함수에서 이 링크가 필요한 버튼 객체에 전달됩니다. OOP에서 기적을 찾을 필요가 없습니다.

글쎄, 또는 두 개의 버튼을 생성하는 클래스를 작성하십시오.

그리고 나는 OOP의 기적을 믿었다).

이러한 옵션을 주셔서 감사합니다. 어떤 옵션이 나에게 가장 적합한지 생각해 보겠습니다.

 
Vasiliy Pushkaryov :

문제 해결을 도와주세요. 두 개의 버튼과 라인이 있습니다. 하나의 버튼을 누르면 편집 모드에서 라인이 표시되고, 놓으면 라인이 삭제됩니다. 두 번째 버튼을 누르면 수정되고, 놓으면 편집 모드로 다시 전환됩니다. 각 버튼은 "선" 개체의 색상 및 기타 속성을 변경할 수 있습니다. "선" 개체는 전역 수준에서 설정됩니다. "Button" 개체 내부의 참조 변수를 조작할 때 모든 변경 사항이 전역 "Line" 개체에 저장되는 방식으로 버튼을 생성한 직후에 "Line" 개체에 대한 참조를 각 버튼에 전달할 수 있습니까?

아래에는 버튼을 클릭하는 대신 "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 (유로USD,H1) Line.count=196

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

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

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

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

2019.07.04 00:44:31.856 1 (유로USD,H1) Line.count=200

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

 
Igor Makanu :

어쩌면 그것이 필요합니까?

2019.07.04 00:44:30.464 1 (유로USD,H1) Line.count=196

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

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

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

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

2019.07.04 00:44:31.856 1 (유로USD,H1) Line.count=200

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

네, 이고르, 가장 많이, 대단히 감사합니다.

나는 여전히 포인터에서 약간 "떠다니는" 상태이므로 귀하의 솔루션은 현재 작업과 포인터 사용 방법을 이해하는 데 많은 도움이 될 것 입니다.

응답해 주셔서 감사합니다.

 
Igor Makanu :

어쩌면 그것이 필요합니까?

2019.07.04 00:44:30.464 1 (유로USD,H1) Line.count=196

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

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

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

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

2019.07.04 00:44:31.856 1 (유로USD,H1) Line.count=200

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

그리고 직접 gLine 포인터를 선언했다면 왜 GetPointer(gLine)를 사용 합니까? )))

예, CLine 객체를 생성하면 다음을 선언할 때도 스스로 제안합니다.

CLine* gLine=새로운 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=새로운 CLine;

버튼을 라인과 연결하는 것은 버튼 초기화 단계에서 자체적으로 제안합니다.

한밤중이었다, 암흑물질이다 - 내가 왜 그런 글을 썼을까... 실은 아예 자고 전화로 스카이프를 깨워서 지나가다가 포럼을 뛰어다녔다)))

하지만 진지하게, 내 예는 교육적이며 실제로 확인하지 않았습니다. 분명히 잠재 의식 수준에서 재보험에 들었습니다. MQL 포인터가 어떤 종류의 엔티티인지 완전히 이해하지 못합니다. C ++의 포인터처럼 작동하지 않습니다.

나는 그것을 알아 내려고했지만 포인터가 함수 매개 변수로 작동하는 방식을 얻지 못했습니다 포인터 사용 방법을 이해하는 데 많은 도움이 될 것 입니다.

응답해 주셔서 감사합니다.

제발! MQL 포인터를 사용하면 @Vladimir Simakov 가 쓴 것처럼 동작이 독특합니다. 작업은 매개변수가 있는 생성자를 작성하여 가장 잘 해결할 수 있습니다. 추상화의 관점에서 일반적으로 이 작업을 수행합니까? - 이것은 정확하지 않지만 편리하고 항상 올바르게 작동합니다. - 컴파일러는 포인터를 바인딩하는 것을 잊지 않도록 합니다.

if(CheckPointer(m_Line)==POINTER_DYNAMIC)

이 검사는 제외될 수 있습니다. any에 대한 생성자를 호출할 때 포인터를 저장하십시오.

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

와우, 작업은 두 개체가 라인에 대한 포인터를 동시에 기다릴 때까지 기다리지 않는 것으로 나타났습니다. 그리고 일반적으로 - 포인터를 전송할 대상. 누가 이런일이 일어날 거라고 생각 했 겠어.

포인터를 어딘가에 전달할 수 있으려면 new를 통해 객체를 생성할 필요가 전혀 없습니다. 그러나 포인터가 전달되는 클래스에는 포인터 변수(별표 * 포함)가 있어야 합니다.

 
Igor Makanu :

한밤중이었다, 암흑물질이다 - 내가 왜 그런 글을 썼을까... 실은 아예 자고 전화로 스카이프를 깨워서 지나가다가 포럼을 뛰어다녔다)))

하지만 진지하게, 내 예는 교육적이며 실제로 확인하지 않았습니다. 분명히 잠재 의식 수준에서 재보험에 들었습니다. MQL 포인터가 어떤 종류의 엔티티인지 완전히 이해하지 못합니다. C ++의 포인터처럼 작동하지 않습니다.

나는 그것을 알아 내려고했지만 포인터가 함수 매개 변수로 작동하는 방식을 얻지 못했습니다 https://www.mql5.com/ru/forum/1111/page2470#comment_11796309 - 거기에 함수에 대한 포인터를 전달하지만 현실 나는 포인터의 새 복사본을 만듭니다

추신: MQL 포인터의 범위를 파악할 수 없습니다. 또한 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,...

그리고 두 번째 경우에는 다음이 필요합니다.

저녁에 확인해볼게 진짜 도움말에 써먹은 정보가 없어서 아마 맞을듯

고맙습니다!

 
& 없이 참조가 아닌 포인터를 전달할 수도 있습니다.