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

 
Koldun Zloy :

이것은 모두 분명합니다. SetSaveRequired() 및 G etSaveRequired()가 비정적이지만 정적 변수에 기록되는 이유는 명확하지 않습니다.

이것이 나에게 명확하지 않아 도움을 요청한 이유입니다. 수정자를 거의 사용하지 않으며 더 직관적이지만 항상 최적의 솔루션을 원합니다

코드에서 질문해 보겠습니다. 이제 다음과 같습니다.

 //+------------------------------------------------------------------+
interface IStrategy
{   double       Strategy();
   bool         Finalize(); };
//+------------------------------------------------------------------+
class CStrategy: public IStrategy
{
public :
   bool               GetSaveRequired() { return (CStrategy::f_save_required); CStrategy::f_save_required = false ;  }
protected :
   static bool        f_save_required;
   double             ProfitStrategy;
   void                SetSaveRequired() { CStrategy::f_save_required = true ;                                       }
   void               RunStrategy();
   virtual void       NextStepStrategy();
   void               EndStrategy();
};

//____________________________________________________________________
void CStrategy::RunStrategy( void )
{  ProfitStrategy = 0.0 ;
   SetSaveRequired();
//...........    
}
//____________________________________________________________________
void CStrategy::EndStrategy( string func)
{ //...........    
   SetSaveRequired();
}
//____________________________________________________________________
#define CLASS(NAME) class NAME : public CStrategy{\
public :\
   NAME(SSettingsForOrder & set )  { m_setting = set ;}\
   ~NAME()                       { delete m_order; }\
   virtual void NextStepStrategy();}
//+------------------------------------------------------------------+
CLASS(CStrategy_XXX);
CLASS(CStrategy_YYY);
CLASS(CStrategy_ZZZ);

void CStrategy_XXX::NextStepStrategy( void ) { SetSaveRequired();    //...........     }
void CStrategy_YYY::NextStepStrategy( void ) { SetSaveRequired();    //...........     }
void CStrategy_ZZZ::NextStepStrategy( void ) { SetSaveRequired();    //...........     }


public GetSaveRequired()는 이 모든 전략을 관리하기 위해 클래스에서 사용됩니다.

이러한 템플릿을 사용하여 NextStepStrategy 메서드만 작성합니다. 그 안에 차량에 대한 변경 사항만 있고 나머지는 모두 동일하므로 기본 클래스 CStrategy 의 모든 메서드와 모든 필드를 수집합니다.

추신: 내 코드가 얼음이 아니라는 느낌이 들지만 정확히 그렇게 작동할 것이며 f_save_required 변수의 복제본을 생성하지 않을 것입니다.

[삭제]  
Igor Makanu :

이것이 나에게 명확하지 않아 도움을 요청한 이유입니다. 수정자를 거의 사용하지 않으며 더 직관적이지만 항상 최적의 솔루션을 원합니다

코드에서 질문해 보겠습니다. 이제 다음과 같습니다.


public GetSaveRequired()는 이 모든 전략을 관리하기 위해 클래스에서 사용됩니다.

이러한 템플릿을 사용하여 NextStepStrategy 메서드만 작성합니다. 그 안에 차량에 대한 변경 사항만 있고 나머지는 모두 동일하므로 기본 클래스 CStrategy의 모든 메서드와 모든 필드를 수집합니다.

추신: 내 코드가 얼음이 아니라는 느낌이 들지만 정확히 그렇게 작동할 것이며 f_save_required 변수의 복제본을 생성하지 않을 것입니다.

나는 이러한 기능을 완전히 제거할 것입니다.

구조를 변경하지 않는 모든 기능은 일정합니다.

모든 비 const 함수는 쓰기 플래그를 설정해야 합니다.

그리고 Save( int fileHandle ) 함수도 추가할 것입니다. 이 함수는 구조를 작성하고 플래그를 재설정해야 합니다.

플래그의 상태를 가져오기 위해 정적 함수를 만들 수 있습니다.

 if ( CStrategy::GetSaveRequired() )
{
   int fileHandle = FileOpen ( ... );
   for ( int i = 0 ; i < 10 ; i++ )
   {
      strategies[i].Save( fileHandle );
   }
   FileClose ( fileHandle );
}
 
Koldun Zloy :

나는 이러한 기능을 완전히 제거할 것입니다.

구조를 변경하지 않는 모든 기능은 일정합니다.

모든 비 const 함수는 쓰기 플래그를 설정해야 합니다.

예를 들면 일반적으로 수정자를 사용하는 데 문제가 있습니다.


추신: 인터넷에서 더욱 그렇습니다. 일반적으로 프로그래밍에 대한 토론에서 벌어지는 일에 대한 공포 - 지난 달 Habré에 const에 대한 기사가 있었습니다. 요점은 - 예, 이 const는 필요하지 않습니다. 어셈블러 코드는 const가 없는 것과 다르지 않습니다. 컴파일러는 모든 것을 제거합니다(((

 
Igor Makanu :

예를 들면 일반적으로 수정자를 사용하는 데 문제가 있습니다.

구글링해서 읽었는데 또 뭔가 잘못됐어...

 class A {
private :
   int x;
public :
   void f( int v) const { Print ( "const" );                  }
   void f( const int v) { x = v; Print ( "(const) x = v " );  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
//+------------------------------------------------------------------+
void OnStart ()
{ 
   int y       = 1 ;
   const int z = 2 ;
   a.f( 3 );
   a.f(y);
   a.f(z); 
 }
//+------------------------------------------------------------------+

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

적어도 한 번은 Print ( "const" )를 받을 것으로 예상했습니다.
 
Igor Makanu :

구글링, 읽기, 뭔가 잘못되었습니다 ...

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x=v

적어도 한 번은 Print ( "const" )를 받을 것으로 예상했습니다.
 class A {
private :
   int x;
public :
   void f( int v) const { Print ( "const" );                  }
   void f( const int v) { x = v; Print ( "(const) x = v " );  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart ()
{ 
   int y       = 1 ;
   const int z = 2 ;
   a.f( 3 );
   a.f(y);
   a.f(z);
   b.f( 3 );
   b.f(y);
   b.f(z);
 }
이것은 const 클래스에 대한 오버로드입니다.
 
Vladimir Simakov :
이것은 const 클래스에 대한 오버로드입니다.

흠 .. 확실히, 나는 거의 30 분 동안 읽었고 habr과 포럼을 읽었지만 들어갈 수 없었습니다.

고맙습니다! 이제 알았다

그러한 예가 다음과 같은 의심이 여전히 있습니다.

 class A {
private :
   int x;
public :
   void f( int v) const { Print ( "const" );                  }
   const void f( int v) { x = v; Print ( "(const) x = v " );  }

};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart ()
{ 
   int y       = 1 ;
   const int z = 2 ;
   a.f( 3 );
   a.f(y);
   a.f(z);
   b.f( 3 );
   b.f(y);
   b.f(z);
 }

2019.09.13 22:04:34.295 tst (EURUSD,H1) (상수) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (상수) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (상수) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) 상수

2019.09.13 22:04:34.295 tst (EURUSD,H1) 상수

2019.09.13 22:04:34.295 tst (EURUSD,H1) 상수


같은 값을 주었는데 의미가 완전히 다른가요? -여기서 홀의 도움이 다시 필요합니다.
 
저는 현재 OOP에 대한 강의를 듣고 있습니다. 아마도 나는 가치있는 것을 찾을 것입니다 - 나는 공유 할 것입니다))
현재 강의를 재설정할 수 있습니다. 물론 진부한 일이지만.
 
Nikolai Semko :
저는 현재 OOP에 대한 강의를 듣고 있습니다. 아마도 나는 가치있는 것을 찾을 것입니다 - 나는 공유 할 것입니다))
현재 강의를 재설정할 수 있습니다. 물론 진부한 일이지만.

글쎄, 당신의 강의는 아마도 횡설수설 할 것입니다. 그러나 여기 러시아어로 무엇을 압니까, 당신은 세 번째 라운드 동안 인터넷을 돌아 다녔습니다 ... 그것은 우울한 일입니다. 일반적으로 상황은 여기 포럼에서와 같습니다. 리소스당 실제 프로그래머가 10명 이하이고 나머지는 에니키 작업자입니다.

좋아, 일반적으로 const를 사용하면 상황이 정리되고 나머지 수정자와 함께 작업했습니다. 일반적으로 이론을 최고로 충분히 얻었습니다 ... 적용해야합니다. 그렇지 않으면 학생처럼 느껴집니다. ))

 
Igor Makanu :

글쎄, 당신의 강의는 아마도 횡설수설 할 것입니다. 그러나 여기 러시아어로 무엇을 압니까, 당신은 세 번째 라운드 동안 인터넷을 돌아 다녔습니다 ... 그것은 우울한 일입니다. 일반적으로 상황은 여기 포럼에서와 같습니다. 리소스당 실제 프로그래머가 10명 이하이고 나머지는 에니키 작업자입니다.

좋아, 일반적으로 const를 사용하면 상황이 정리되고 나머지 수정자와 함께 작업했습니다. 일반적으로 이론을 최고로 충분히 얻었습니다 ... 적용해야합니다. 그렇지 않으면 학생처럼 느껴집니다. ))

네 저도 비슷한 상황입니다. 배우는 것은 어렵지 않으며, 다시 배우고 오래된 습관을 깨는 것이 더 어렵습니다. 나는 여전히 절차적 프로그래밍의 많은 나쁜 습관을 버릴 수 없습니다.

 
Igor Makanu :

예를 들면 일반적으로 수정자를 사용하는 데 문제가 있습니다.


추신: 인터넷에서 더욱 그렇습니다. 일반적으로 프로그래밍에 대한 토론에서 벌어지는 일에 대한 공포 - 지난 달 Habré에 const에 대한 기사가 있었습니다. 요점은 - 예, 이 const는 필요하지 않습니다. 어셈블러 코드는 const가 없는 것과 다르지 않습니다. 컴파일러는 모든 것을 제거합니다(((

지금은 상수와 정적에 대해 잊어도 됩니다. 인터페이스에도.

그러나 모든 것이 준비되면 어떤 것은 정적인 것으로, 어떤 것은 상수로 보고 표시하십시오. 그리고 인터페이스에서는 일반적으로 망치질할 수 있습니다.