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

 
Igor Makanu :

OOP 스타일 코드로 내 전투의 결과를 검토했습니다 - 흠... 훌륭합니다! ))))


질문이 나타났지만 내 코드에서는 세 번 양식 구성이 정확히 사용되었습니다.

호출은 모두 privat 방식이지만 "제다이 트릭"이 있습니까? CheckPointer(m_order)==POINTER_INVALID에서 소스 텍스트를 이스케이프하려면

get/set에 대해 묻고 있습니다.

특별한 문제는 없지만 C ++의 OOP 기술에 대한 지식에 대한 갈증이나 변덕이 아직 가라 앉지 않았습니다.

질문이 "많은 문자"인 경우 !CheckPointer(mPtr)이고 함수 호출 인 경우 생성자에서 모든 NULL 포인터를 초기화하고 코드에서 이를 비교하여 ptr 삭제를 기억합니다. ptr=NULL;

 
Igor Makanu :

OOP 스타일 코드로 내 전투의 결과를 검토했습니다 - 흠... 훌륭합니다! ))))


질문이 나타났지만 내 코드에서는 세 번 양식 구성이 정확히 사용되었습니다.

호출은 모두 privat 방식이지만 "제다이 트릭"이 있습니까? CheckPointer(m_order)==POINTER_INVALID에서 소스 텍스트를 이스케이프하려면

get/set에 대해 묻고 있습니다.

특별한 문제는 없지만 C ++의 OOP 기술에 대한 지식에 대한 갈증이나 변덕이 아직 가라 앉지 않았습니다.


Igor, 내 생각에 당신이 무엇을 묻는지 이 예 를 보십시오.

 
Vladimir Simakov :

질문이 "많은 문자"인 경우 !CheckPointer(mPtr)이고 함수 호출 인 경우 생성자에서 모든 NULL 포인터를 초기화하고 코드에서 이를 비교하여 ptr 삭제를 기억합니다. ptr=NULL;

자, 여기 설탕이 있습니다.

 #define DELETE(dObj) do if (dObj!= NULL ) { delete dObj; dObj= NULL ;} while ( false )
 
Igor Makanu :

특별한 문제는 없지만 C ++의 OOP 기술에 대한 지식에 대한 갈증이나 변덕이 아직 가라 앉지 않았습니다.

클래스의 모든 필드를 생성자에서 기본값으로 초기화하는 것이 좋습니다. 요점은 이 작업을 수행하려는 경우:

 void foo(){
   CClass someClass;
   someClass.DoSomething();
}

, 그러면 아무도 클래스의 필드를 초기화하지 않고 가비지 값이 있을 것입니다.

 
Vladimir Simakov :

자, 여기 설탕이 있습니다.

아니요, 거의 정의를 남겼습니다. 몇 주 전에 썼던 것처럼 아무 것도 래핑하고 싶지 않습니다. 지금은 OOP 스타일의 깨끗한 코드를 보고 싶습니다. 유연성과 가능성에 감사드립니다.

추신: 생성할 때 자식을 정의할 때만 래핑했습니다. 동일한 유형의 초기화를 3줄에 쓰지 않도록 나중에 메서드를 추가하는 것이 더 쉽습니다. 소스 코드에서 한 번에 한 줄씩

 #define CLASS(NAME,FUNC)....

CLASS(CStrategy01,ReOpenOrder( __FUNCTION__ ,getDealType()==BUY ? SELL : BUY));
로만 :


Igor, 내 생각에 당신이 무엇을 묻는지 이 예 를 보십시오.

아니요, 나는 C #의 아날로그에 대해 이야기하고 있습니다 - 연산자 ?? ( null-union operator ), C ++ 스타일의 논리에서 비슷한 것을보고 싶습니다.


상향:

블라디미르 시마코프 :

클래스의 모든 필드를 생성자에서 기본값으로 초기화하는 것이 좋습니다. 요점은 이 작업을 수행하려는 경우:

, 그러면 아무도 클래스의 필드를 초기화하지 않고 가비지 값이 있습니다.

나는 그냥 기본 클래스의 모든 것과 모든 것을 초기화하는 생성자, 자손이 기본 클래스를 초기화하는 것을 했습니다.

이것은 올바르게 초기화하는 것을 잊지 않기 위해 매크로로 감싼 것입니다.)))

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public :\
   NAME(SStrategySettings & set ):CStrategy( set ){ }\
   virtual void NextStepStrategy( void ) {FUNC;}}
//____________________________________________________________________
 
Igor Makanu :

아니요, 거의 정의를 남겼습니다. 몇 주 전에 썼던 것처럼 아무 것도 래핑하고 싶지 않습니다. 지금은 OOP 스타일의 깨끗한 코드를 보고 싶습니다. 유연성과 가능성에 감사드립니다.

추신: 생성할 때 자식을 정의할 때만 래핑했습니다. 동일한 유형의 초기화를 3줄에 쓰지 않도록 나중에 메서드를 추가하는 것이 더 쉽습니다. 소스 코드에서 한 번에 한 줄씩

아니요, 나는 C #의 아날로그에 대해 이야기하고 있습니다 - 연산자 ?? ( null-union operator ), C ++ 스타일의 논리에서 비슷한 것을보고 싶습니다.

전처리기를 헛되이 거부합니다. 템플릿과 함께 이들은 가장 강력한 도구입니다. 운영자 아날로그 ?? 그냥 존재하지 않는 것 같습니다. C++는 이와 관련하여 더 하드코어합니다.
 
Vladimir Simakov :
전처리기를 헛되이 거부합니다. 템플릿과 함께 이들은 가장 강력한 도구입니다. 운영자 아날로그 ?? 그냥 존재하지 않는 것 같습니다. C++는 이 점에서 더 하드코어합니다.

나는 여전히 순수한 OOP 스타일에 대한 전투가 있습니다. 포럼에 자산이 있는 동안 모든 OOP 기술을 배우고 싶습니다.)

전처리기 면에서 내 수준을 높였지만 ... 내 의견으로는 남용해서는 안됩니다. 적어도 내 스타일은 아닙니다. 엉망이 될 수 있으며 여러 매크로 대체가있는 코드를 빨리 읽을 수 없습니다. , 하지만 버그를 찾는 방법 ... 글쎄, 다시 작성하는 것이 더 쉽습니다. 일반적으로 필요하지 않습니다.


템플릿 ... 글쎄, 나는 개발자들이 안보리에서 제공하는 것이 전혀 마음에 들지 않았습니다. 모든 것을 검토했습니다. 어떤 목적으로 그들이 안보리에 포함되었는지 말하기는 어렵습니다. 아마도 그들의 때가 아직 오지 않았을 것입니다.

C++ 템플릿을 MQL로 이식하는 방법 - 토론에서 알 수 있듯이 대부분의 경우 C++ 템플릿이 MQL용 "파일"로 마무리되어야 하는 시기입니다. MQL을 괴롭히지 않고 .dll로 돌아가는 것이 더 쉽습니다))

 
Igor Makanu :

나는 여전히 순수한 OOP 스타일에 대한 전투가 있습니다. 포럼에 자산이 있는 동안 모든 OOP 기술을 배우고 싶습니다.)

전처리기 면에서 내 수준을 높였지만 ... 내 의견으로는 남용해서는 안됩니다. 적어도 내 스타일은 아닙니다. 엉망이 될 수 있으며 여러 매크로 대체가있는 코드를 빨리 읽을 수 없습니다. , 하지만 버그를 찾는 방법 ... 글쎄, 다시 작성하는 것이 더 쉽습니다. 일반적으로 필요하지 않습니다.


템플릿 ... 글쎄, 나는 개발자들이 안보리에서 제공하는 것이 전혀 마음에 들지 않았습니다. 모든 것을 검토했습니다. 어떤 목적으로 그들이 안보리에 포함되었는지 말하기는 어렵습니다. 아마도 그들의 때가 아직 오지 않았을 것입니다.

C++ 템플릿을 MQL로 이식하는 방법 - 토론에서 알 수 있듯이 대부분의 경우 C++ 템플릿이 MQL용 "파일"로 마무리되어야 하는 시기입니다. MQL을 괴롭히지 않고 .dll로 돌아가는 것이 더 쉽습니다))

따라서 템플릿을 직접 작성할 수 있습니다.)))
 
Vladimir Simakov :
따라서 템플릿을 직접 작성할 수 있습니다.)))

네 )))

모든 것이 매크로에 있기 때문에 마지막으로 도움말을 스크롤하여 재정의를 놓쳤습니다.

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public :\
   NAME(SStrategySettings & set ):CStrategy( set ){ }\
   void NextStepStrategy( void ) override {FUNC;}}

상향:

아니, 그렇지 않다. 어째서인지 그 자신이 접근권한을 벗어났으니, 공적인 방법은 필요 없다!

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
private :\
void NextStepStrategy( void ) override {FUNC;}\
public :\
   NAME(SStrategySettings & set ):CStrategy( set ){ }}
 
Vladimir Simakov :

자, 여기 설탕이 있습니다.

 #define DELETE(dObj) do if (dObj!= NULL ) { delete dObj; dObj= NULL ;} while ( false )

차라리 나보다 먼저 쓰고 싶었어

 if ( CheckPointer (m_order)== POINTER_INVALID )

다음과 같았습니다.

 if (m_order== NULL )

하지만 MQL에서 매크로 대체를 확인하는 방법을 기억했습니다.

 void OnStart ()
{   int a = 0 ;
#ifdef NULL
   a = 1 ;
#endif

   Print ( "a = " ,a);
   Print ( "POINTER_INVALID = " , POINTER_INVALID );
   Print ( "NULL = " ,( int ) NULL );   // без (int) не компилируется!!!

}

2019.09.16 22:57:42.837 tst (EURUSD,H1) 에이 = 1

2019.09.16 22:57:42.837 tst (EURUSD,H1) 포인터_INVALID = 0

2019.09.16 22:57:42.837 tst (EURUSD,H1) NULL = 0


내 기억이 도움이된다면 연초에 로그에 NULL을 인쇄하고 거기에서 0을 얻는 것이 가능했습니다. 이제 오류가 발생합니다.

저것들. NULL의 동작은 미래에 변경되어서는 안되지만 NULL을 대체하는 것은 명확하지 않습니다. 아마도 지금 이 상황을 확인 했다면 다음과 같이 썼습니다. ( CheckPointer (m_order) == POINTER_INVALID ) 그러면 이것이 올바른 코드 말하자면 )))