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

 
Ilya Malev :

자세한 답변 감사합니다만, 논리를 조금 이해하지 못했습니다.

1) 컴파일러는 왜 B* b1=a 구성을 복사 연산자 A:: A(const A&)에 대한 호출로 인식하고 B:: B(const A&)에 대한 호출이 아닌 것으로 인식합니까? 연산자의 왼쪽 =)

2) 컴파일러에서 "복사 생성자 누락" 경고가 발생하지 않은 이유

3) 존재하지 않는 객체에 대해 "단순한" 메서드 호출이 허용되는 이유(A::f()를 직접 호출하려고 하는 동안 "비 정적 메서드 호출" 컴파일 오류 발생)

1) 나는 이것이 명백한 실수라고 썼으며 어떤 경우에도 수정할 것입니다.

2) 복사 생성자는 사용자가 선언하지 않은 경우 컴파일러에 의해 생성됩니다.

3) 질문이 완전히 명확하지 않습니다.
토론의 맥락에서:
포인터에 액세스할 수 없는 경우 포인터를 "역참조"하는 것이 올바른지 여부에 대해 오랫동안 논쟁하는 것이 가능합니까?
역참조 작업(핸들에서 실제 포인터 가져오기)은 "내부"(사용자 정의가 아님) 코드이며 비용이 많이 드는(없는 것에 비해) 코드입니다.
포인터 액세스가 없는 경우 역참조하는 이유는 무엇입니까?
그대로 남아 있는 한 포인터 액세스가 없으면 역참조 작업이 최적화 프로그램에 의해 제거됩니다.

 
Ilya Malev :

4) 컴파일러가 일반적으로 가상 메서드에 대한 "단순한" 호출을 허용하는 이유는 무엇입니까? 제 생각에는 가상이 객체에 있는 데이터의 존재 여부에 의존해서는 안 됩니다.

당신은 따뜻함과 부드러움을 혼동하고 있습니다.

Call devirtualization은 개체에 필드의 유무와 관계가 없는 별도의 최적화 방법입니다.

 
Ilyas :

2) 복사 생성자는 사용자가 선언하지 않은 경우 컴파일러에 의해 생성됩니다.

왼쪽에 개체 B가 있습니다. 왜 생성자 A::A(A&)가 호출(또는 생성)됩니까? 이것은 OOP의 원칙에 위배됩니다.
 
Alexey Navoykov :
왼쪽에 객체 B가 있는데 왜 생성자 A::A()가 호출됩니까?

연산자 =, ==, !=, !, && 및 || 왼쪽은 포인터이고 오른쪽은 "객체" 유형입니다. 동시에 이러한 연산자는 포인터에 오버로드될 수 없습니다.

따라서 plz 개발자는 이 버그를 수정할 때 위의 연산자를 동적 개체에 대해 오버로드 가능하게 만드십시오.

 
메타트레이더 4 애플리케이션이 작동을 멈추고 시작 시 약 1초 동안 작동한 다음 왼쪽 상단 모서리(구매/판매)에 원 클릭 거래 창이 나타난 다음 애플리케이션이 닫힙니다.
이 문제를 해결하는 방법에 대한 옵션이 있습니까?
도움을 주셔서 미리 감사드립니다.
 
Ilya Malev :

연산자 =, ==, !=, !, && 및 || 왼쪽은 포인터이고 오른쪽은 "객체" 유형입니다.

예, 포인터는 어디에 있습니까? 나는 이미 여기 에서 당신 에게 대답 했습니다 . 여기서는 포인터 없이 작동합니다.
 
Alexey Navoykov :
왼쪽에 개체 B가 있습니다. 왜 생성자 A::A(A&)가 호출(또는 생성)됩니까? 이것은 OOP의 원칙에 위배됩니다.

나는 당신의 말에 전적으로 동의하며 이것이 수정될 실수라고 이미 썼습니다.

이 경우 컴파일러는 개체 생성에서 수행할 수 없는 적절한 상속 오버로드를 선택했습니다.

 
일리아스 :

포인터에 액세스할 수 없는 경우 포인터를 "역참조"하는 것이 올바른지 여부에 대해 오랫동안 논쟁하는 것이 가능합니까?

역참조 작업(핸들에서 실제 포인터 가져오기)은 "내부"(사용자 정의가 아님) 코드이며 비용이 많이 드는(없는 것에 비해) 코드입니다.
포인터 액세스가 없는 경우 역참조하는 이유는 무엇입니까?

가상 메서드 목록은 개체에 대한 정보이기 때문에 데이터 자체보다 덜 중요하고 가상 메서드에 대한 액세스는 포인터 액세스입니다. 예를 들어 내 예에서 쓰는 경우

  A* aa=a;
  B* b1=a;   
   b1=aa;
  b1.f();

그런 다음 B::f() 를 다시 얻습니다. 여기에 A* 객체의 포인터 B*에 대한 명시적인 할당이 이미 있지만 A*에서 "복사"되고 참조 A*에 있습니다. 이것은 이미 "잘못된" 복사 생성자를 호출하는 것보다 더 심각한 상황입니다. 개체에 가상 메서드가 없더라도 액세스할 때 포인터의 유효성을 확인해야 합니다.

 
Alexey Navoykov :
왼쪽에 개체 B가 있습니다. 왜 생성자 A::A(A&)가 호출(또는 생성) 됩니까? 이것은 OOP의 원칙에 위배됩니다.

확실히 호출되는 것이 있습니까? 나는 x32에 체크인했다:

 class A {
public :
        A()           { Print ( __FUNCSIG__ ); }
        A( const A& ) { Print ( __FUNCSIG__ ); }
} a;
class B : public A {
public :
        B()           { Print ( __FUNCSIG__ ); }
        B( const B& ) { Print ( __FUNCSIG__ ); }
} *b = a;
void OnStart () {}

결과: A::A()
그리고 더 이상 아무것도!

 
A100 :

확실히 호출되는 것이 있습니까? 나는 x32에 체크인했다:

결과: A::A()
그리고 더 이상 아무것도!

그래서 제너레이터/옵티마이저의 덤프를 확인하러 갔습니다.