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

 
Igor Makanu :

int가 이 특정 생성자를 호출하기 위한 임의의 숫자이더라도 초기화할 항목이 없습니다.

오타가 없도록 0.0을 선택했습니다. 0.0. 쓰기와 타이핑은 123보다 어렵다

(더블)0

하지만 그렇지도 않고, 사실이기도 하다))) 이제야 코드가 정상으로 보였고, 여전히 비정상적으로 보일 수 있는 방법이 있다))
 
Alexandr Andreev :

(더블)0

아니요

0.0만 씁니다. 다른 숫자는 필요하지 않습니다. 생성자에 변수도 없습니다.

일반적으로 얼마나 세련된가 - 저자의 스타일, 아마도 최고는 아닐 것입니다.

 
Alexandr Andreev :

요점은 x가 아님) 그러나 리셉션에 이중 외에 플로트가있을 수 있다는 사실은 단순히 0.0을 표시하십시오. 또한 신뢰할 수 없음

0.0은 컴파일러에 대해 명확한 double이고 float는 0.f가 됩니다.
 
Vladimir Simakov :
0.0은 컴파일러에 대해 명확한 double이고 float는 0.f가 됩니다.

오프셋)

 

"50명을 위한 질문" 섹션이 열려 있는 동안 내 자신과 함께 카스트에 대한 주제로 들어가겠습니다.

- 내결함성 또는 비중복성 측면에서 코드를 개선하는 방법은 무엇입니까?

- CheckPointer() !=POINTER_INVALID를 확인해야 합니까? 아니면 확실히 필요하지 않습니까? 이유를 설명해라.

- non-const 메소드를 호출할 수 있도록 non-const로 캐스팅. Compare 메서드에서 non-const를 직접 호출할 수 있습니까? 저것들. 노란색으로 강조 표시된 것을 제거하십시오. 상수?

 #include <ChartObjects\ChartObjectsShapes.mqh>

class CChartObjectRectangleX : public CChartObjectRectangle
  {
public :

   void CChartObjectRectangleX(){};      
   virtual int        Compare( const CObject *node, const int mode= 0 ) const 
   {
   CChartObjectRectangleX *n= NULL ;
   const CChartObjectRectangleX*nc= dynamic_cast < const CChartObjectRectangleX*>(node);
   if (nc!= NULL )
   n=(CChartObjectRectangleX *) nc;
   if (n!= NULL ) {
     if (mode== 0 ) return CompareDate(n); 
     if (mode== 1 ) return CompareValue(n); } return 0 ;    }
 
   virtual int        CompareDate( CChartObjectRectangleX *node) const { 
   // if (node!= NULL ) 
       return ( this .Time( 1 )-node.Time( 1 )); return 0 ;    }
     virtual int        CompareValue( CChartObjectRectangleX *node) const { 
   // if (node!= NULL ) 
       return (( this .Price( 1 )-node.Price( 1 ))* 10 / Point ()); return 0 ;    }
};
 
Aleksey Mavrin :

"50명을 위한 질문" 섹션이 열려 있는 동안 내 자신과 함께 카스트에 대한 주제로 들어가겠습니다.

- 내결함성 또는 비중복성 측면에서 코드를 개선하는 방법은 무엇입니까?

- CheckPointer()!=POINTER_INVALID 확인이 필요한가요? 아니면 확실히 필요하지 않습니까? 이유를 설명해라.

- non-const 메소드를 호출할 수 있도록 non-const로 캐스팅. Compare 메서드에서 non-const를 직접 호출할 수 있습니까? 저것들. 노란색으로 강조 표시된 것을 제거하십시오. 상수?

 class CChartObjectRectangleX : public CChartObjectRectangle
  {
public :
   virtual int        Compare( const CObject *node, const int mode= 0 ) const
   {
   const CChartObjectRectangleX *n= dynamic_cast < const CChartObjectRectangleX*>(node);
   return !n? 0 : mode== 0 ?CompareDate(n):CompareValue(n);}
   
   virtual int CompareDate( const CChartObjectRectangleX *node) const { return !node? 0 : int (Time( 1 )-node.Time( 1 ));}
   virtual int CompareValue( const CChartObjectRectangleX *node) const { return !node? 0 :( int ) MathRound (((Price( 1 )-node.Price( 1 ))* 10 / Point ()));}
};

당신과 일대일처럼 보이지만 작은 글자 만 있습니다. 따라서 누가 더 좋아하는지 여부는 취향의 문제이지만 추가 변수를 제거했습니다(대부분의 경우 컴파일러는 최적화의 일부로 제거했을 것입니다).

내 !노드에 대해. 좋은 점은 CheckPointer(node)==POINTER_INVALID로 대체되어야 하지만 이는 오버헤드, 함수 호출입니다. 인라인되더라도 최소한 상태 플래그를 역참조하고 확인합니다. Compare 메서드가 라이브러리 또는 사용자가 작성한 특정 프로그램인 경우 잘못된 포인터를 제출하지 않도록 !node를 사용하고 코드를 따르는 것이 좋습니다. 포인터를 따라가기에는 너무 게으르거나 이것이 비주니어용 라이브러리인 경우 CheckPointer(node)==POINTER_INVALID만 사용하십시오.

강조 표시한 const 지정자를 제거하면 const 개체 에서 이러한 메서드를 호출할 수 없습니다.

UPD: 강조 표시된 검사는 호출된 메서드에 있으므로 제거할 수 있습니다.

 
Aleksey Mavrin :

"50명을 위한 질문" 섹션이 열려 있는 동안 내 자신과 함께 카스트에 대한 주제로 들어가겠습니다.

- 내결함성 또는 비중복성 측면에서 코드를 개선하는 방법은 무엇입니까?

- CheckPointer()!=POINTER_INVALID 확인이 필요한가요? 아니면 확실히 필요하지 않습니까? 이유를 설명해라.

- non-const 메소드를 호출할 수 있도록 non-const로 캐스팅. Compare 메서드에서 non-const를 직접 호출할 수 있습니까? 저것들. 노란색으로 강조 표시된 것을 제거하십시오. 상수?

이론적으로 const 본문이 있거나 없는 한 기능에 대해 두 가지 방법을 작성하는 것은 가치가 없습니다)))

그러나 두 가지 방법을 만날 확률은 0에 가깝습니다. .... const는 이 코드에서 놓칠 수 있습니다. 왜냐하면 CChartObjectRectangle:: Price - 본문에 const가 없는 경우 - 있을 가능성은 거의 없다고 생각합니다.

글쎄, 그것은 외부에서 이 함수의 호출에 영향을 미치지 않습니다. 저것들. const는 내부 함수에서만 작동하며 아무도 객체의 메모리에 아무것도 쓰지 않도록 합니다(변수 값을 변경하지 않음). 저것들. 당신은 consts로 Set(a)를 호출할 수 없습니다... 종종, 어떤 종류의 혼란 속에서 이 함수가 어떤 것도 덮어쓰지 않는다는 것을 확실히 하기 위해, 당신은 이 consts를 빠르게 배열할 수 있습니다(이것은 아마도 나의 착각일지라도).

const는 )))) 나중에 확인하기가 더 쉬울 수 있도록 아무데나 넣어야 한다고 믿어집니다.


CheckPointer()!=POINTER_INVALID 검사가 필요합니까?

그리고 왜 안되나요.... 이론상으로 하나의 bool Check(<template> &T) { retun CheckPointer(T)!=POINTER_INVALID }를 만드십시오. 컴파일러는 이 모든 것을 가장 단순한 형태로 최적화해야 합니다. (nc!= NULL ) 같은 것, 그리고 결국 get. 그리고 예, 더 멋지게 보일 것입니다.

이것은 더 빠른 오페라에서

 int a[ 1000 ];
for ( int i= 0 ; i< ArraySize (a); i++)....
или
for ( int i= ArraySize (a); i>= 0 ; i--)....
дак вот разницы не должно быть вообще


글쎄, 나는 많이 변하지 않았다.

 template < typename T>
bool Check(T *a) { return CheckPointer (a)!= POINTER_INVALID ;};

class CChartObjectRectangleX : public CChartObjectRectangle
  {
   #define ME CChartObjectRectangleX
public :
   void ME(){};      
   virtual int        Compare( const CObject *node, const int mode= 0 ) const 
   {
   const ME*nc= dynamic_cast < const ME*>(node);
   return Check(nc)?mode== 0 ?CompareDate(nc):CompareValue(nc): 0 ;
   } 
   virtual int        CompareDate( const ME *node) const             { return ( this .Time( 1 )-node.Time( 1 ));}
   virtual int        CompareValue( const ME *node) const            { return (( this .Price( 1 )-node.Price( 1 ))* 10 / Point ()); }
 #undef ME
};

이것은 완전한 코드입니다.

 
Vladimir Simakov :

당신과 일대일처럼 보이지만 작은 글자 만 있습니다. 따라서 누가 더 좋아하는지 여부는 취향의 문제이지만 추가 변수를 제거했습니다(대부분의 경우 컴파일러는 최적화의 일부로 제거했을 것입니다).

내 !노드에 대해. 좋은 점은 CheckPointer(node)==POINTER_INVALID로 대체되어야 하지만 이는 오버헤드, 함수 호출입니다. 인라인되더라도 최소한 상태 플래그를 역참조하고 확인합니다. Compare 메서드가 라이브러리 또는 사용자가 작성한 특정 프로그램인 경우 잘못된 포인터를 제출하지 않도록 !node를 사용하고 코드를 따르는 것이 좋습니다. 포인터를 따라가기에는 너무 게으르거나 이것이 비주니어용 라이브러리인 경우 CheckPointer(node)==POINTER_INVALID만 사용하십시오.

강조 표시한 const 지정자를 제거하면 const 개체 에서 이러한 메서드를 호출할 수 없습니다.

나는 오랫동안 탭을 열어 두었다


mde 캠페인 건설 기술 학교에서 4년 동안 공부했는데 지식이 추가되지 않았습니다(설명 능력이 쓰레기통에 뒤처짐)

 

const가 없는 변형 기본 클래스에 입력 매개변수에 대한 참조가 없으면 이 스타일이 그다지 유능하지 않더라도 올바르게 작동합니다.

 #include <ChartObjects\ChartObjectsShapes.mqh>

template < typename T>
bool Check(T *a) { return CheckPointer (a)!= POINTER_INVALID ;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define ME CChartObjectRectangleX
public : 
   void ME(){};      
   virtual int        Compare(CObject *node, int mode= 0 ) 
   {
   ME*nc= dynamic_cast <ME*>(node);
   return Check(nc)?mode== 0 ?CompareDate(nc):CompareValue(nc): 0 ;
   } 
   virtual int        CompareDate(ME *node)             { return ( this .Time( 1 )-node.Time( 1 ));}
   virtual int        CompareValue(ME *node)            { return (( this .Price( 1 )-node.Price( 1 ))* 10 / Point ()); }
 #undef ME
};
 

동일한 변형, 동일한 코드

 template < typename T>
bool Check(T *a) { return CheckPointer (a)!= POINTER_INVALID ;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define ME CChartObjectRectangleX
public : 
   void ME(){};      
   virtual int        Compare(CObject *node, int mode= 0 )      { return Check(node)?mode== 0 ?CompareDate(node):CompareValue(node): 0 ;} 
   virtual int        CompareDate(CObject *node)             { return (  Time( 1 )- dynamic_cast <ME*>(node).Time( 1 ));}
   virtual int        CompareValue(CObject *node)            { return ((Price( 1 )- dynamic_cast <ME*>(node).Price( 1 ))* 10 / Point ()); }
 #undef ME
};


그는 consts와 함께

 template < typename T>
bool Check(T *a) { return CheckPointer (a)!= POINTER_INVALID ;};

class CChartObjectRectangleX : public CChartObjectRectangle
  { #define ME CChartObjectRectangleX
public : 
   void ME(){};      
   virtual int        Compare(CObject const *node, int const mode= 0 )   const { return Check(node)?mode== 0 ?CompareDate(node):CompareValue(node): 0 ;} 
   virtual int        CompareDate(CObject const *node)                 const { return (  Time( 1 )- dynamic_cast < const ME*>(node).Time( 1 ));}
   virtual int        CompareValue(CObject const *node)               const { return ((Price( 1 )- dynamic_cast < const ME*>(node).Price( 1 ))* 10 / Point ()); }
 #undef ME
};