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

 
Igor Makanu :

동의하지 않는다:

"할당 연산자"와 "복사 생성자"가 무엇인지, 어떻게 다른지, 언제 어떻게 호출되는지(명시적 및 묵시적) 정보를 업데이트하십시오.
코드에서 함수의 지역 변수 반환을 노란색으로 강조 표시하면 기본 복사 생성자가 호출됩니다(할당 연산자와 혼동하지 말 것).

"전체 데이터 유형"이 불행히도 완전히 명확하지 않으며 코드로 증명하려는 것도 아닙니다...
반복합니다: " MQL의 기본 할당 연산자는 데이터 유형 void를 반환합니다."

 struct A{
   int x,y;
};

void OnStart (){
   A a, b;
   Print ( typename (a = b));   // void
}
 
Koldun Zloy :

당신은 잘못.

이것을 반환하는 자신만의 operator=를 정의하고 차이점을 확인하십시오.

과제의 결과가 다시 할당되면 이를 확인할 수 있습니다.

연산자 = 를 정의하면 원래 목표에서 벗어나 기본값 ::=을 호출합니다.

해결되지 않은 문제인 것 같습니다.


세르게이 주블리크 :

"전체 데이터 유형"이 불행히도 완전히 명확하지 않으며 코드로 증명하려는 것도 아닙니다...

full is full - 데이터 구조 가 저장되며 새 필드를 추가하면 구조 복사를 제어할 필요가 없습니다.

 
Igor Makanu :

연산자 = 를 정의하면 원래 목표에서 벗어나 기본값 ::=을 호출합니다.

그런 임무가 정말로 필요합니까?

b = c = a;
 
Igor Makanu :

full is full - 데이터 구조 가 저장되며 새 필드를 추가하면 구조 복사를 제어할 필요가 없습니다.

그런 다음 귀하의 용어에 따라 기본 할당 연산자를 호출하면 "불완전한 데이터 유형"이 생성될 수 있습니다.
2019.05.03 일자 버그는 여전히 수정되지 않았습니다: https://www.mql5.com/en/forum/1111/page2451#comment_11556395

 
Koldun Zloy :

그런 임무가 정말로 필요합니까?

순전히 이론상 필요합니다. 이것이 일종의 "새로운 엔티티"인지 알고 싶었습니다. 연산자 =

실제 사용을 위해 전혀 필요하지 않습니다. 문제없이 2 개의 연산자로 기록 할 것입니다.


세르게이 주블리크 :

그런 다음 귀하의 용어에 따라 기본 할당 연산자를 호출하면 "불완전한 데이터 유형"이 생성될 수 있습니다.
2019.05.03 일자 버그는 수정되지 않았습니다: https://www.mql5.com/en/forum/1111/page2451#comment_11556395

"내 용어"는 질문하는 것입니다, 나는 불만이 없습니다,

그러나 기본 연산자를 사용하는 의미 = , 구조의 필드만 설명하고 배열의 차원을 포함하여 모든 것이 복사되는 것이 편리합니다(차원이 증가하더라도 - 작동 원리는 ArrayCopy() 처럼)


글쎄, 그것이 버그라면, 지금까지는

 

순전히 이론적인 질문.

아마도 SB에서 다음과 같은 생성자 호출을 보았습니다.

 class A{
public :   
   A(){ Print ( __FUNCTION__ );}
};

class B{
public :   
   A a1,a2;
   B() :a1(),a2() { Print ( __FUNCTION__ ); }   
};

이 코드의 차이점은 무엇입니까?

 class A{
public :   
   A(){ Print ( __FUNCTION__ );}
};

class B{
public :   
   A a1,a2;
   B() { Print ( __FUNCTION__ ); }   
};

나는 그것을 인쇄했지만 차이점을 보지 못했습니다. 그리고 조금 더 구체적으로 - 객체 a1 및 a2의 생성자에 대한 강제 호출을 사용할 수 있는 이유 또는 제공하는 것은 무엇입니까?

첫 번째 옵션의 "편의성"은 무엇입니까?

 
Igor Makanu :

순전히 이론적인 질문.

아마도 SB에서 다음과 같은 생성자 호출을 보았습니다.

이 코드의 차이점은 무엇입니까?

나는 그것을 인쇄했지만 차이점을 보지 못했습니다. 그리고 조금 더 구체적으로 - 객체 a1 및 a2의 생성자에 대한 강제 호출을 사용할 수 있는 이유 또는 제공하는 것은 무엇입니까?

첫 번째 옵션의 "편의성"은 무엇입니까?

생성자에는 매개변수가 있으며 어떻게든 전달해야 합니다.

즉, 매개변수가 없어도 차이는 없지만 생성자 A(int arg)가 있으면 완전히 다른 옥양목

 
Maxim Kuznetsov :

생성자에는 매개변수가 있으며 어떻게든 전달해야 합니다.

즉, 매개변수가 없어도 차이는 없지만 생성자 A(int arg)가 있으면 완전히 다른 옥양목

당신이 아마도 옳을 것입니다 - 일반적으로 작업에 따라 다릅니다

나는 첫 번째 옵션 때문에 어려움을 겪었습니다. 클래스 B의 2개의 생성자 를 사용하려고 할 때 - 두 생성자 모두에서 코드 중복이 발생했습니다. - 제거했습니다. 질문이 나타났습니다. 어디서 보았고 어디에 그렇게 썼습니까?)))

 
Igor Makanu :

객체 a1 및 a2의 생성자의 강제 호출을 사용할 수 있는 이유는 무엇입니까?

프로세스의 정확한 이름은 "생성자 a1 및 a2의 강제 호출"이 아니라 클래스 필드의 초기화(비정적)입니다.
다음과 같은 경우 필수:

- 클래스 상수 필드의 사용;
- 클래스 필드에 대한 기본 생성자의 부재;
- 생성자 호출을 통하지 않는 다른 초기화 방법으로 클래스 필드 객체가 없는 경우(예: 할당 연산자가 제거됨)
-...

 

그리고 누군가 이 필드 초기화가 무엇인지 설명합니다.

CArray::CArray( void ) : m_step_resize( 16 ),
                       m_data_total( 0 ),
                       m_data_max( 0 ),
                       m_sort_mode(- 1 )
  {
  }

이것보다 더 나은:

CArray::CArray( void )
  {
        m_step_resize= 16 ;
        m_data_total= 0 ;
        m_data_max= 0 ;
        m_sort_mode=- 1 ;
  }

그리고 어쨌든, 요점이 무엇입니까?