CList sort()가 작동하도록 CObject에서 Compare()를 재정의하는 방법은 무엇입니까? - 페이지 4

 
Ex Ovo Omnia :

"this" 값을 얻기 위해 Compare( ) 함수 에서 "&" 연산자 가 필요한 이유가 궁금합니다.


Compare() 메서드는 "const"이고 내부에서 "const"가 아닌 메서드를 호출할 수 없기 때문입니다.

이 예제에서 2페이지의 코드를 참조하십시오. getPrice() 메서드는 const가 아니며 그 안에 있는 CopyClose() 함수 도 const가 아닙니다. 모든 메서드는 "const"로 변경할 수 있지만 CopyClose()는 그렇지 않습니다.

어쨌든 "&" 연산자는 const가 아닌 메서드에 대한 액세스를 제공하므로 " const" 메서드 내에서 호출할 수 있습니다.

 
Gustavo Hennemann :

Compare() 메서드는 "const"이고 내부에서 "const"가 아닌 메서드를 호출할 수 없기 때문입니다.

이 예제에서 2페이지의 코드를 참조하십시오. getPrice() 메서드는 const가 아니며 그 안에 있는 CopyClose() 함수 도 const가 아닙니다. 모든 메서드는 "const"로 변경할 수 있지만 CopyClose()는 그렇지 않습니다.

어쨌든 "&" 연산자는 const가 아닌 메서드에 대한 액세스를 제공하므로 " const" 메서드 내에서 호출할 수 있습니다.


이제 알겠어. 나는 그것이 유효한 구조라면 아마 당신은 알고 있을지 모르겠습니다. 나에게는 Java와 같이 MQL에서 'const' 메소드 선언을 완전히 피하는 것이 좋습니다.

 
Ex Ovo Omnia :

이제 알겠어. 나는 그것이 유효한 구조라면 아마 당신은 알고 있을지 모르겠습니다. 나에게는 Java와 같이 MQL에서 'const' 메소드 선언을 완전히 피하는 것이 좋습니다.


std 라이브러리의 컬렉션 클래스(예: 검색, 정렬 등)의 (매우 유용한) 메서드를 활용하려면 CObject 의 Compare 메서드를 재정의해야 합니다 . 즉, Compare 메서드 내에서 호출되는 모든 메서드도 const 메서드 여야 합니다. OP는 이 세부 사항을 우회하지 않았으며 OP는 ' this' 포인터를 올바르게 사용하지 않았습니다. 따라서 단순히 this.DoSomething()을 호출하는 대신 OP는 (self) 개체에 대한 자체 포인터를 만들었습니다. 예를 들어 otherSelfPointer.DoSomething()

 
nicholishen :

std 라이브러리의 컬렉션 클래스(예: 검색, 정렬 등)의 (매우 유용한) 메서드를 활용하려면 CObject 의 Compare 메서드를 재정의해야 합니다 . 즉, Compare 메서드 내에서 호출되는 모든 메서드도 const 메서드 여야 합니다. OP는이 세부 사항을 우회하지 않았으며 OP는 this 포인터를 올바르게 사용하지 않았습니다. 따라서 this.DoSomething()을 호출하는 대신 OP는 단순히 this 키워드를 사용하는 대신 (self)object에 대한 자체 포인터를 만들었습니다. 예를 들어 otherSelfPointer.DoSomething()


나는 그가 한 일을 이해합니다. 문제는 이 구조가 (일반적으로) 무해한 경우입니다. 컴파일러는 개체가 const 함수에서 해당 멤버를 수정할 것으로 예상하지 않습니다.

 
Ex Ovo Omnia :

나는 그가 한 일을 이해합니다. 문제는 이 구조가 (일반적으로) 무해한 경우입니다. 컴파일러는 개체가 const 함수에서 해당 멤버를 수정할 것으로 예상하지 않습니다.

이 특정 경우에는 값만 가져오고 아무 것도 변경하지 않습니다. 그러나 const 값을 변경하려고 하면 컴파일러에서 이 문제에 대해 경고하거나 최악의 경우 런타임 예외가 발생합니다.

 
Ex Ovo Omnia :

나는 그가 한 일을 이해합니다. 문제는 이 구조가 (일반적으로) 무해한 경우입니다. 컴파일러는 개체가 const 함수에서 해당 멤버를 수정할 것으로 예상하지 않습니다.


오.... 이제 알겠어, 내 나쁜. 이는 잠재적으로 위험할 수 있습니다. OP는 Compare()의 범위 내 모든 메서드도 const 메서드 인지 확인해야 합니다.

 
Gustavo Hennemann :

안녕하세요 @Alain Verleyen

CopyClose()를 사용하여 getPrice() 메서드를 변경했습니다. CopyBuffer()를 사용하고 있습니다. 이것은 주요 목표를 변경하지 않습니다.

따라서 getPrice() 메서드에서 "const" 키워드를 사용하면 " 'CopyBuffer' - 어떤 오버로드도 함수 호출에 적용될 수 없습니다 ."라는 오류가 발생합니다. CopyBuffer가 const 메서드가 아니고 const 메서드 내에서 non const 메서드를 호출할 수 없기 때문에 발생한다고 생각합니다.

답변이 늦어 죄송합니다만, 지금까지 주제를 팔로우할 시간이 없었습니다.

CopyBuffer()를 사용할 때 getPrice()를 const로 선언할 수 없는 이유를 여전히 모르겠습니다. 이해가 되지 않습니다. 업데이트된 getPrice() 버전을 게시할 수 있습니까?

 

모든 업데이트