오류, 버그, 질문 - 페이지 1357

 
그건 그렇고, 나는 위의 코드에서 뭔가를 이해하지 못했습니다. operator==는 어디에서 호출됩니까? 두 개의 long을 비교한 것뿐입니다.
 
Alexey Navoykov :
그건 그렇고, 나는 위의 코드에서 뭔가를 이해하지 못했습니다. operator==는 어디에서 호출됩니까? 두 개의 long을 비교한 것뿐입니다.
 class A { public :
         bool operator ==( const A& ) { Print(__FUNCTION__); return true; }
};
class B {};
void OnStart ()
{
         bool res;
        A *a1, *a2;
        B *b1, *b2;
        res = a1 == a2; //сейчас сравниваются указатели
                        //предлагается вызывать operator==()
        res = b1 == b2; //сравниваются указатели (предложение здесь ничего не меняет, поскольку нет B::operator==)
        res = IsEqualPointer( a1, a2 ); //сравниваются указатели
}
IsEqualPointer는 템플릿 또는 ::GetPointer와 같은 일반 함수일 수 있습니다.
 
A100 :

...

IsEqualPointer는 템플릿 또는 ::GetPointer와 같은 일반 함수일 수 있습니다.

내가 당신을 이해하는 것을 완전히 중단했습니다. 당신이하려고하는 것을 평신도의 용어로 설명 할 수 있습니까? 위의 코드에 오류가 있습니다(== 연산자에는 인수도 반환 값도 없습니다). 이 모든 것으로부터 무언가를 이해하기 어렵습니다.

포인터를 비교/할당하는 문제는 한번도 발생하지 않았다는 점을 바로 말씀드리지만, GetPointer (a) == GetPointer(b)면 충분합니다. 따라서 작업은 개체 자체의 비교/할당만 참조합니다. 저것들. 이러한 개체가 포인터 또는 링크로 표시되는지 여부에 관계없이 이러한 작업을 수행하는 것이 보장됩니다.

 
Alexey Navoykov :

위의 코드에 오류가 있습니다(== 연산자에는 인수도 반환 값도 없습니다). 이 모든 것으로부터 무언가를 이해하기 어렵습니다.

수정했습니다. 정의된 경우 포인터에 대해 operator==(...)를 호출하는 것이 좋습니다. 그러면 GetPointer (a)==GetPointer(b)는 a.operator==( b )를 호출하므로 IsEqualPointer가 비교하도록 제안됩니다. 평등을 위한 포인터
 
A100 :
GetPointer(a)==GetPointer(b) 는 결과적으로 a.operator==( b )가 호출됩니다.
어때요?
 
Alexey Navoykov :

그건 그렇고, *& 연산자를 MQL에 도입하여 첫 번째 경우에는 명시적으로 개체에 액세스하고 두 번째 경우에는 (성가신 GetPointer 대신) 개체 포인터 를 가져오는 것은 어떻습니까? 그리고 별표는 단순히 필사적으로 필요합니다. 언어로 대체할 수 있는 것은 없습니다. 이것이 없으면 A100이 조금 더 높게 언급한 것처럼 개체 자체 대신 포인터로 일부 작업이 수행되는 상황을 제어할 수 없습니다. 개인적으로 이것은 끊임없는 문제입니다. 항상 경계하거나 A.operator=(B), A.operator!=(B)를 명시적으로 지정해야 합니다. 간결함이 사라지고 연산자 오버로딩은 실제로 의미를 잃습니다.

나는 어떻게 든 이미이 문제를 제기했지만 주제는 사라졌습니다. 마지막으로 이 질문을 마치겠습니다.

다음 용도를 의미하는 경우 게시해 주셔서 감사합니다.
CFoo   f1,f2;
CFoo *pf1=&f1;
CFoo *pf2=&f2;

*pf1!=*pf2
*pf1=*pf2;

나는 이것에 동의합니다. 나는 분명히 이 문제를 제기하고 논의할 것입니다.
 
Alexey Navoykov :
어때요?
 class A { public :
         bool operator ==( const A& ) { Print ( __FUNCSIG__ ); return true ; }
         bool operator  <( const A& ) { Print ( __FUNCSIG__ ); return true ; }
};
void OnStart ()
{
         bool res;
        A a1, a2;
        res = GetPointer ( a1 ) == GetPointer ( a2 ); //сейчас сравниваются указатели, а будет вызываться operator==, как сейчас происходит для следующей строки
        res = GetPointer ( a1 )  < GetPointer ( a2 ); //вызывается operator<
}
operator==를 operator<와 동일시하면 결과가 동일해집니다.
 
A100 :
...
operator==를 operator<와 동일시하면 결과가 동일해집니다.

친애하는, 글쎄, 당신은 당신이 제공하는 것을 확인하지도 않았습니다! 이전의 경우와 마찬가지로 코드에 명백한 오류가 있는 경우, 즉 컴파일을 시도하지도 않았습니다. 무릎에 뭔가를 그렸고, '착한 사이에 헉헉대고, 불쌍하지도 않아' 등 나름의 생각도 하고…. 가능할까? 이런 말도 안되는 소리 하지 맙시다.

나 자신도 계속 포인터를 비교하고 연산자를 오버로딩하고 있는데, 지금 당신이 상상하고 있는 것은 한 번도 없었습니다. 이제 코드를 확인한 결과 기적이 일어나지 않았으므로 == 연산자가 정상적으로 시작되지 않습니다.

 
Alexey Navoykov :

이제 코드를 확인한 결과 기적이 일어나지 않았으므로 == 연산자가 정상적으로 시작되지 않습니다.

제안의 본질은 실행하는 것입니다. 기존 시스템의 변경 사항에 대해 이야기하고 있습니다.
 
A100 :
제안의 본질은 실행하는 것입니다.

이게 또 왜? 모든 것이 거꾸로 되어 있습니다.

그 반대가 더 논리적입니다. < 및 >는 포인터를 비교합니다.