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

 
Ilya Malev :

개체에 가상 메서드가 없더라도 액세스할 때 포인터의 유효성을 확인해야 합니다.

일반적으로 이것은 모호한 질문입니다. 예를 들어, C#에서는 이러한 검사가 항상 존재하고 C++에서는 필요할 때만 존재하므로 속도면에서 이점이 있습니다.

결국, 개체의 필드에 액세스할 수 없는 메서드가 호출되면 포인터를 확인할 의미가 없습니다. 본질적으로 이러한 방법은 정적 방법과 동일합니다.

 
Alexey Navoykov :

일반적으로 이것은 모호한 질문입니다. 예를 들어, C#에서는 이러한 검사가 항상 존재하고 C++에서는 필요할 때만 존재하므로 속도면에서 이점이 있습니다.

결국, 개체의 필드에 액세스할 수 없는 메서드가 호출되면 포인터를 확인할 의미가 없습니다. 본질적으로 이러한 방법은 정적 방법과 동일합니다.

개체에는 데이터가 전혀 없을 수 있지만 특수한 유형 종속 방식으로 일부 외부 데이터에 액세스하거나 특별한 작업을 모두 수행하는 것과 같이 완전히 다른 중요한 동작을 구현할 수 있습니다. "데이터가 없는 상태에서 정적(100% 비가상 읽기) 방법의 동등성"과 같은 접근 방식을 정당화하는 방법을 모르겠습니다.

즉, 최소한 포인터 객체에는 항상 하나의 필드가 있습니다. 이것이 바로 해당 유형입니다. 호출된 메서드의 주소를 결정할 수 있습니다. 왜 OOP가 전혀 필요하지 않습니까?

추신 자동 개체의 경우 개인적으로 행동 논리에 반대하는 것이 없지만(거의 사용하지 않기 때문에) 포인터에 할당할 필요가 없습니다.
 

불행히도, 나는 디자인 때문에 모두를 오도했습니다.

B *b=a;
B b=a;

복사 생성자가 아니라 복사 연산자가 호출됩니다.
두 번째 경우 생성자 B()를 호출한 후

어쨌든 먼저 분석한 다음 편집합니다.

 

오, µl에 복사 생성자의 자동 생성이 있다는 것이 밝혀졌습니다(=를 통해서만 obj(other_obj)를 클래스화할 수 없기 때문에 존재하지 않는다고 생각했습니다). 그러나 다음과 같은 경우 생성되지 않는 이유는 다음과 같습니다.

 class Q
{
public :
   Q(Q&)= default ;   // нельзя
   Q( int ) {}       // из-за него копирующий конструктор исчез
};
 
pavlick_ :

오, µl에 복사 생성자의 자동 생성이 있다는 것이 밝혀졌습니다(=를 통해서만 obj(other_obj)를 클래스화할 수 없기 때문에 존재하지 않는다고 생각했습니다). 그러나 다음과 같은 경우 생성되지 않는 이유는 다음과 같습니다.

기본값 및 삭제는 지원되지 않습니다.

기본 복사 생성자는 지금까지 완료된 것으로 보입니다.

복사 연산자만, 즉 디자인:

CFoo foo=another_foo;

기본 CFoo 생성자가 먼저 호출되고 그 다음에 복사 연산자가 호출됩니다.

 
Ilyas :

복사 생성자가 아니라 복사 연산자가 호출됩니다.

그러나 그것은 여전히 오류입니다. 왜냐하면. 암시적 복사 연산자는 모든 상위 클래스가 아니라 클래스 B에 대해서만 생성되어야 합니다. 저것들. 객체는 내부의 부분적인 교체를 허용해서는 안 됩니다.
 
Ilyas :

기본값 및 삭제는 지원되지 않습니다.

네, 하지만 사용자 정의 복사 생성자가 있는 경우에만 복사 생성자 생성을 취소하면 됩니다. 그렇죠? 그리고 어떤 사용자도 아닙니다.

 
Alexey Navoykov :
저것들. 객체는 내부의 부분적인 교체를 허용해서는 안 됩니다.

이것은 일종의 인공적인 자제입니다 ... 나는 말할 것입니다 - 생각의 협소함

 class A {};
class B : public A {
public :
         void operator =( const A& ) {}
};

문제가 무엇입니까?

나는 그런 디자인을 찾았고 ... 모든 것이 잘 작동합니다. 따라서 개발자가 모든 것을 그대로 두는 것이 좋습니다 ... 최소한 해당 연산자 / 생성자가 명시 적으로 정의 된 경우

 
A100 :

이것은 일종의 인공적인 자제입니다 ... 나는 말할 것입니다 - 생각의 협소함

문제가 무엇입니까?

나는 그런 디자인을 찾았고 ... 모든 것이 잘 작동합니다. 따라서 개발자가 모든 것을 그대로 두는 것이 좋습니다 ... 적어도 해당 연산자가 명시 적으로 정의 된 경우

먼저 C++에서 모든 것이 어떻게 작동하는지 확인하십시오. 분명히 그의 규칙은 "편협한 사람들"에 의해 발명되었습니다.

그리고 잘못된 언어 구조로부터 자신을 보호하기 위해 매번 개그로 울타리를 치려면 ... 아니요, 처음에는 현명하게 해야 합니다. 내 말은 언어

 
Alexey Navoykov :

먼저 C++에서 모든 것이 어떻게 작동하는지 확인하십시오. 분명히 그의 규칙은 "편협한 사람들"에 의해 발명되었습니다.

그리고 잘못된 언어 구조로부터 자신을 보호하기 위해 매번 개그로 울타리를 치려면 ... 아니요, 처음에는 현명하게 해야 합니다. 내 말은 언어

특히 당신을 위해 https://www.mql5.com/en/forum/1111/page2358#comment_10003995 를 고려하여 다시 확인했습니다.

 #ifdef __cplusplus
#include "https://www.mql5.com/ru/forum/1111/page2358#comment_10003995"
void OnStart ()
{
        A a;
        B b;
        b = a;
}
#endif

괜찮아 DJ

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.12.24
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы