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

 

Mdyaya ... const와 마찬가지로 사람들은 모든 것을 실행합니다(((

const 지정자를 사용하여 메서드를 이해하려면

 class CTest{
   int i;
public :
   CTest( int _i):i(_i){}
   int Get() const { return i;}
   int Get()   { return 2 *i;}
};

void OnStart ()
  {
   const CTest a( 5 );
   CTest b( 8 );
   Print (a.Get()); //5
   Print (b.Get()); //16
  }

이제 할

   //int Get() const {return i;}

, 그리고 그 반대의 경우도 마찬가지입니다.

 //   int Get()   {return 2*i;}

)))

 
Alexandr Andreev :

동일한 변형, 동일한 코드


그는 consts와 함께

입구가 확실합니까?

Compare(CObject const *node, int const mode= 0 )

항상 주다

CChartObjectRectangleX*

확인하지 않고 쓰기

 return (  Time( 1 )- dynamic_cast < const ME*>(node).Time( 1 ) );

?

 
Alexandr Andreev :

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

그래서 그것은 적합하지 않습니다. 비교에서는 서명을 변경할 수 없습니다. 이를 위해 QuickSort 방식으로 SB에 포함된 일반 정렬이 작동합니다.

서명을 변경하면 Wirth를 재정의하지 않습니다. 함수이지만 오버로드 및 기본 클래스 CObject 메서드가 호출됩니다. 여기서 return 0;

글쎄요, 물론 컨테이너에 래핑(장식)하면 해결되지만, 왜 이러한 추가 움직임을 사용하거나 SB를 사용하지 않고 처음부터 모든 것을 작성합니다.

 
Vladimir Simakov :

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

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

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

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

블라디미르, 이 경우 CheckPointer는 불필요합니다. dynamic_cast는 실패한 캐스트에 대해 NULL을 반환합니다. 포인터가 깨진 경우. 잘못된 경우 수정합니다. 장시간 테스트, 5초 테스트)

CheckPointer 작업 메커니즘은 무엇입니까(간단히 말하면 낮은 수준에서는 강력하지 않음) - 정보를 얻을 수 없는 경우 동적 또는 정적 개체의 종류에 대한 포인터를 확인한 다음 POINTER_INVALID를 찾습니다. 동적 객체가 삭제되면 다른 상황을 잘 모르거나 포인터에 가비지를 던지는 경우일 수 있지만 발견할 허점이 없으면 컴파일러에서 이를 확인해야 합니다.

dynamic_cast는 동일한 작업을 수행하며 이 포인터를 필요한 유형으로 캐스팅할 수 있는지 여부도 확인합니다. 그것이 해당 유형의 포인터인지, 아니면 자식 클래스의 포인터인지 여부.

포인터가 손상되면 dynamic_cast는 아무것도 결정할 수 없으며 NULL을 반환합니다.

그래서 CheckPointer를 사용하지 않았습니다. 일반적으로 모든 곳에서 나는 죄로부터 이 수표를 적용합니다. 그래도 떨어지지 않은 소프트웨어에서 오류를 찾는 것이 조금 더 쉬운 것 같습니다)

const가 아닌 경우 - 이론적으로 GetRatingByAnyFormula() { m_rating01=Formula01(); 반환 m_rating01;}

정렬에 즉시 사용되지 않으면 불편합니다. 어쨌든 먼저 등급을 고려한 다음 이를 기준으로 정렬을 호출합니다. 글쎄, 또는 이미 언급했듯이 처음부터 SB를 작성하십시오)

 
Aleksey Mavrin :

그래서 그것은 적합하지 않습니다. 비교에서는 서명을 변경할 수 없습니다. 이를 위해 QuickSort 방식으로 SB에 포함된 일반 정렬이 작동합니다.

서명을 변경하면 Wirth를 재정의하지 않습니다. 함수이지만 오버로드 및 기본 클래스 CObject 메서드가 호출됩니다. 여기서 return 0;

글쎄요, 물론 컨테이너에 래핑(장식)하면 해결되지만, 왜 이러한 추가 움직임을 사용하거나 SB를 사용하지 않고 처음부터 모든 것을 작성합니다.

가장 정확한 방법은 µl에 쓰지 않는 것입니다.

 
Aleksey Mavrin :

블라디미르, 이 경우 CheckPointer는 불필요합니다. dynamic_cast는 실패한 캐스트에 대해 NULL을 반환합니다. 포인터가 깨진 경우. 잘못된 경우 수정합니다. 장시간 테스트, 5초 테스트)

CheckPointer 작업 메커니즘은 무엇입니까(간단히 말하면 낮은 수준에서는 강력하지 않음) - 정보를 얻을 수 없는 경우 동적 또는 정적 개체의 종류에 대한 포인터를 확인한 다음 POINTER_INVALID를 찾습니다. 동적 객체가 삭제되면 다른 상황을 잘 모르거나 포인터에 가비지를 던지는 경우일 수 있지만 발견할 허점이 없으면 컴파일러에서 이를 확인해야 합니다.

dynamic_cast는 동일한 작업을 수행하며 이 포인터를 필요한 유형으로 캐스팅할 수 있는지 여부도 확인합니다. 그것이 해당 유형의 포인터인지, 아니면 자식 클래스의 포인터인지 여부.

포인터가 손상되면 dynamic_cast는 아무것도 결정할 수 없으며 NULL을 반환합니다.

그래서 CheckPointer를 사용하지 않았습니다. 일반적으로 모든 곳에서 나는 죄로부터 이 수표를 적용합니다. 그래도 떨어지지 않은 소프트웨어에서 오류를 찾는 것이 조금 더 쉬운 것 같습니다)

const가 아닌 경우 - 이론적으로 GetRatingByAnyFormula() { m_rating01=Formula01(); 반환 m_rating01;}

정렬에 즉시 사용되지 않으면 불편합니다. 어쨌든 먼저 등급을 고려한 다음 이를 기준으로 정렬을 호출합니다. 글쎄, 또는 이미 언급했듯이 처음부터 SB를 작성하십시오)

  1. 비교 메서드는 공개로 정의됩니다. 즉, 사양에서 그에게 어떻게 말하든 상관없이 모든 nedojun은 분명히 잘못된 설명자를 채울 것입니다(스페이드를 스페이드라고 부르자). 물론 이것이 라이브러리가 아니라 자신을 위한 것이라면 필요하지 않습니다.
  2. CheckPointer 가 어떻게 작동하는지 모르겠습니다. 최대 ... 옵션이 있습니다. 그러나 어쨌든 이것은 프로세서 주기와 메모리 액세스입니다(쉽게 가상으로 판명될 수 있음).
  3. const 지정자가 있는 메서드 정보 라이브러리를 작성하는 경우 개체의 상태를 변경하지 않는 메서드에서 개체가 일정해야 할 수도 있다는 점을 항상 염두에 두어야 합니다. 비록 지금은 나 자신을 위해 나 자신이 이것에 특별히 신경 쓰지는 않지만.
  4. 자신의 SB를 작성하십시오. 아마도 이것이 올바른 결정일 것입니다. 여기에 지불 / 노동 비용의 비율에 대한 흥미로운 전망이 아직 보이지 않습니다. 즉, 아무 것도 제기되지 않으므로 우리 자신의 필요에 대해서만)
 
Vladimir Simakov :

내 !노드에 대해. 좋은 점은 CheckPointer(node)==POINTER_INVALID로 대체되어야 하지만 이는 오버헤드, 함수 호출입니다.

깨진 포인터가 프로그램의 논리를 변경한다는 점에서 문제는 오버헤드에 있지 않습니다. 저것들. 문제를 드러내는 대신 더 깊이 파고들 것입니다.

CheckPointer 는 디버깅 목적으로만 사용하거나 약한 포인터 구현으로 사용해야 합니다.

 
Vladimir Simakov :
  1. 비교 메서드는 공개로 정의됩니다. 즉, 사양에서 그에게 어떻게 말하든 상관없이 모든 nedojun은 분명히 잘못된 설명자를 채울 것입니다(스페이드를 스페이드라고 부르자). 물론 이것이 라이브러리가 아니라 자신을 위한 것이라면 필요하지 않습니다.
  2. CheckPointer가 어떻게 작동하는지 모르겠습니다. 최대 ... 옵션이 있습니다. 그러나 어쨌든 이것은 프로세서 주기와 메모리 액세스입니다(쉽게 가상으로 판명될 수 있음).
  3. const 지정자가 있는 메서드에 대해 라이브러리를 작성하는 경우 개체의 상태를 변경하지 않는 메서드에서 개체가 일정해야 할 수도 있다는 점을 항상 염두에 두어야 합니다. 비록 지금은 나 자신을 위해 나 자신이 이것에 특별히 신경 쓰지는 않지만.
  4. 자신의 SB를 작성하십시오. 아마도 이것이 올바른 결정일 것입니다. 여기에 지불 / 노동 비용의 비율에 대한 흥미로운 전망이 아직 보이지 않습니다. 즉, 아무 것도 제기되지 않으므로 우리 자신의 필요에 대해서만)

1. 나는 주장하지 않지만 CheckPointer 가 필요하지 않다고 말했습니다(비 주니어용이라도), tk. dynamic_cast 는 NULL 포인터를 반환할 수 없으며 NULL만 반환합니다.

2. 흥미롭긴 하지만 동적 개체를 죽이는 것 외에도 잘못된 포인터를 얻는 방법 또는 작업 과정에서 메모리를 직접 "더티"하는 방법에 대한 예가 즉시 생각나지 않습니다.

여전히 그러한 방법이 있다고 생각하지만 모두 컴파일러 검사를 우회하는 평면에 있을 가능성이 큽니다.

3.4 동의

추신

제가 1번을 잘못 알고 있었던 것 같습니다. 테스트는 그렇지 않다고 말합니다. 그래서 보였다)

 void OnStart ()
  {
      CChartObjectRectangle *base = new CChartObjectRectangle();
      CChartObjectRectangleX *rect = new CChartObjectRectangleX();
       CChartObjectRectangle * dbase  ;
       const CChartObjectRectangleX *drect  ;
       Print ("dbase= ",dbase, " NULL ? ",dbase== NULL ," check? ",!dbase, " broken? ", EnumToString ( CheckPointer (dbase) ));
      dbase= dynamic_cast < CChartObjectRectangle *>  (base);
       Print ("dbase= ",dbase, " NULL ? ",dbase== NULL , " check? ",!dbase," broken? ", EnumToString ( CheckPointer (dbase) ));
       delete base;
       Print ("dbase= ",dbase, " NULL ? ",dbase== NULL ," check? ",!dbase, " broken? ", EnumToString ( CheckPointer (dbase) ));
      dbase= dynamic_cast < CChartObjectRectangle *>  (base);   
       Print ("dbase= ",dbase, " NULL ? ",dbase== NULL ," check? ",!dbase, " broken? ", EnumToString ( CheckPointer (dbase) ));   
  }
 
클래스의 공개 섹션에서 정적 배열 을 선언하고 생성자에서 초기화할 수 있습니까? (아래와 같이) (또는 요소별로만?)
 bool Mass[ 5 ] = { false , true , false , true , true };
 
Pavel Verveyko :
클래스의 공개 섹션에서 정적 배열 을 선언하고 생성자에서 초기화할 수 있습니까? (아래와 같이) (또는 요소별로만?)

로컬 배열을 초기화하고 해당 필드 배열에 대해 ArrayCopy를 수행할 수 있습니다.

 class A{
public :
   bool Mass[ 5 ];
   A(){
       bool mass_init[ 5 ] = { false , true , false , true , true };
       ArrayCopy (Mass, mass_init);
   }
};