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

 
A100 :

특별히 고려하여 재확인한 경우

괜찮아 DJ

어떤 컴파일러가 있습니까?

나는 VS 2010에 있습니다 :

바이너리 '=': 'A' 유형의 오른쪽 피연산자를 사용하는 연산자를 찾을 수 없습니다(또는 허용되는 변환이 없음).

ps. "고려하다"가 무슨 뜻인지 정말 이해가 안 가나요? 기본 클래스를 파생 클래스로 암시적으로 복사할 수 있는 가능성에 관한 것이었습니다.

 

Visual Studio에서 내 예제 도 작동합니다. 명시적 복사 연산자를 의미하고 코드로 설명했습니다.

혹시라도 신경질적으로 금지하면 노골적으로 동시에 금지되는 일이 무심코 금지되는 일이 없도록 썼습니다

 
A100 :

Visual Studio에서 내 예제 도 작동합니다. 명시적 복사 연산자를 의미하고 코드로 설명했습니다.

명시적인 운영자에 대한 이야기는 없었습니다. 나는 당신이 "좁은 생각"이라고 부르는 이 경우에 암시적 연산자의 허용 불가에 대해 이야기했지만 이것은 그렇지 않습니다.

복사하려면 C++에서 먼저 명시적으로 b를 원하는 유형으로 캐스팅해야 합니다. 이러한 복사는 객체 캡슐화를 위반하는 것입니다. 그러므로 어떤 암시도 있어서는 안 됩니다.

 
A100 :

명시적 복사 연산자를 의미하고 코드로 설명했습니다.

그건 그렇고, 클래스 A가 일부 클래스 X에서도 상속된다면 클래스 B는 어떤 식으로든 X에 의해 복사 방지되지 않습니다(MQL에 대해 이야기하고 있습니다). 모든 상위 클래스에 대한 연산자를 작성해야 합니다.
 
A100 :

나는 컴파일러가 그것들을 (코드의 맥락에서) 명시적 및 암시적 것으로 분리하는지 의심합니다. 그렇지 않으면 쉽게 고칠 수 있습니다.

결론은 암시적 연산자는 항상 개체의 유형과 일치한다는 것입니다. 저것들. 유형 B의 개체인 경우 유형이 const B&인 암시적 연산자가 있습니다. 유형 A는 허용되지 않습니다. 그러나 이것은 C++에 있습니다.
 

그건 그렇고 연산자 유형으로 모든 것이 잘 된 것 같습니다.

먼저 연산자 B:: 를 찾고, 없으면 A:: 에서 이미 찾고, 거기에도 없으면 의무가 완료된 것으로 간주하고 아무 것도 하지 않습니다(포인터가 결국 고장난) :)

 
Ilya Malev :

그것이 거기에 없다면 그것은 의무가 완료된 것으로 간주하고 아무 것도하지 않습니다 (포인터가 결국 파손되었지만) :)

왜 아무것도 하지 않는 걸까요? 암시적(자동) operator=(const A&)를 사용하여 복사하는데, 그렇게 해서는 안 됩니다.

예, 그리고 마침내 B 다음에 이 별표를 제거하면 눈이 아파요) 이 버그로 모든 것이 이미 파악되었습니다.

 
Alexey Navoykov :

예, 그리고 마침내 B 다음에 이 별표를 제거하면 눈이 아파요) 이 버그로 모든 것이 이미 파악되었습니다.

개인적으로 별표가 없는 객체 변수가 눈을 아프게 합니다)) 나쁜 실수 중 하나는 *a 대신 A=new A라고 쓰고 무슨 일이 일어나는지 오랫동안 이해하지 못하는 것입니다) 반대로 모든 것이 올바르게 작동하는 것을 보여주었습니다 조언을 따르고 개인 작업을 선언하면 =&. 이 경우 편집기에서 즉시 오류가 발생합니다. 앞으로도 항상 이렇게 할게요 :)

 
나는 불일치를 찾는 데 몇 시간을 보냈다. 이것을 찾았습니다
 #define PRINT(A) Print ( #A + " = " + ( string )(A))

void OnStart ()
{
   const double Koef =   0.25 ;
   const int iDelta = 32 ;
   const double point = 0.00001 ;
  
   const double high = 1.06736 ;
   const double low = 1.06676 ;
  
   const double Avg = (high + low) * 0.5 ;  
   const double Size = (high - low) * Koef * 0.5 ;  
  
  PRINT( DoubleToString (Avg - Size - point * iDelta, 5 ));   // DoubleToString(Avg-Size-point*iDelta,5) = 1.06666
  PRINT( DoubleToString (Avg - (Size + point * iDelta), 5 )); // DoubleToString(Avg-(Size+point*iDelta),5) = 1.06667
} 


나는 double의 기능을 알고 있지만 덧셈 순서를 변경하면( 상대적으로 매우 다른 숫자는 제외) 결과가 달라질 것입니다! 여기에서 무슨 일이 일어나고 있는지 바보에게 설명하십시오.

소스에서는 맨 아래 두 줄만 보면 됩니다.

 

개발자를 위한 오류입니다.

스크립트가 컴파일되지 않고 이유를 확인))). 첨부파일을 활용하시기 바랍니다.


같은 파일:


파일:
Test1.mq5  9 kb