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

 

가상 기능 의 오류

 class A { public :
         virtual void f() { Print ( __FUNCTION__ ); }
};
class B : public A { public :
         virtual void f() { Print ( __FUNCTION__ ); }
};

class H { public :
        H( A* a ) { H::s[ 0 ] = a; }
         static void g();
         static A* s[ 1 ];
};
A *H::s[ 1 ] = { 0 };
void H::g() { H::s[ 0 ].f(); } //еще обратил внимание, что в этом месте редактор выделяет (.f) зеленым
void OnStart ()
{
        A* b = new B();
        H h( b );
        H::g(); //печатает A::f()
        delete ( b );
}

결과: A::f(), 그러나 B::f()여야 합니다.

 
시장에서 스패머를 처리하려면 어떻게 해야 합니까? 그는 불만을 썼고 스패머는 하루 동안 차단되었습니다. 이제 그는 이미 차단이 해제되었으며 그의 똥이 매달려 있습니다. 아니면 괜찮아? 제품 토크 페이지는 고객 피드백을 위한 페이지가 아닌가요?
 
Motoellesse :

OS MAVERICKS에 META TRADER 4를 설치하고 모든 프로그램을 다운로드하고 MAC에서 재생하는 데 도움이 됩니다. ^ 모두 새로워지고 오류가 발생합니다.

/*조정자: 오류 텍스트를 파일로 첨부*/

 
Motoellesse :

2 - 디버깅 전.

3- 후.

차이가 있을 수 있는데 전혀 이해가 안됨)

매우 감사합니다)

파일:
 

컴파일 오류

 class A {
public :
         void f() const { a = 1 ; } //member of the constant object cannot be modified
         static int a;
};
int A::a = 0 ;

const는 static을 따를 필요가 없지만

게다가 이것은 정적이 일반적인 함수 h()에 의해 수정되고 A:: f() const는 그것에 대해 알지 못하기 때문에 이것은 가상의 보호입니다.

 class A {
public :
         void f() const { h(); } //все равно поменяли значение (а)
         static int a;
};
int A::a = 0 ;

void h()
{
        A::a = 1 ;
}
 
A100 :

가상 기능 의 오류

결과: A::f(), 그러나 B::f()여야 합니다.

게시해 주셔서 감사합니다. 수정되었습니다.
 
A100 :

컴파일 오류

const는 static을 따를 필요가 없지만

게다가 이것은 정적이 일반적인 함수 h()에 의해 수정되고 A:: f() const는 그것에 대해 알지 못하기 때문에 이것은 가상의 보호입니다.

게시해 주셔서 감사합니다. 수정되었습니다.
 

h( A* a)를 호출하는 모든 경우에 컴파일 오류 358

 class A {
};

class B {
public :
	B() : a1( NULL ), a2( NULL ), a3( NULL ), a4( NULL ) {}
         void f() const {
                h( a1 ); // не обоснована (1)
                h( a2 ); // не обоснована (2)
                h( a3 ); //    обоснована (3)
                h( a4 ); //    обоснована (4)
        }
              A *       a1;
              A * const a2;
         const A *       a3;
         const A * const a4;
};

void h( A* a )
{
}

h( const A* a)가 아니기 때문에 (3)과 (4)에서만 정당화됨

비슷한 상황이 이미 https://www.mql5.com/ru/forum/1111/page1218#comment_1058402 수정되었지만 오류 발생이 const 의 존재에 의해 영향을 받기 때문에 아마도 다른 이유가 있을 것입니다. void f() const 선언이 없고 멤버 함수가 없습니다.

 

빌드 976에서 컴파일되지 않습니다(오류 358, 그러나 빌드 975에서 오류가 없다는 점에서 앞에서 설명한 것과 다름).

 class A {};
struct S { int s; };

void h1( A* a ) {}
void h2(       S& s ) {}
void h3( const S& s ) {}

class B {
public :
         void     f1() const { h1( this .a ); } //не обоснованная и возникла только в build 976
//      void    f2() const { h2( this.s ); } //   обоснованная ошибка в build 976
         void     f3() const { h3( this .s ); } //нормально
        A* a;
        S  s;
};
아마도 빌드 976에서 const 클래스 메서드 에서 호출된 일반 함수가 const&가 아닌 참조에 의해 전달된 클래스 멤버를 수정할 수 있다는 사실과 관련된 버그가 수정되었기 때문일 수 있습니다. 그러나 여기서 클래스 멤버는 포인터이고 그 값은 h( A* a)를 호출할 때 변경되지 않는 것이 보장되지만 h( A* &a )를 선언할 때만 변경할 수 있습니다.
 
A100 :

빌드 976에서 컴파일되지 않습니다(오류 358, 그러나 빌드 975에서 오류가 없다는 점에서 앞에서 설명한 것과 다름).

아마도 빌드 976에서 const 클래스 메서드 에서 호출된 일반 함수가 const&가 아닌 참조에 의해 전달된 클래스 멤버를 수정할 수 있다는 사실과 관련된 버그가 수정되었기 때문일 수 있습니다. 그러나 여기서 클래스 멤버는 포인터이고 그 값은 h( A* a 가 호출될 때) 변경되지 않는 것이 보장되지만 h( A* &a ) 선언될 때만 변경할 수 있습니다.
게시해 주셔서 감사합니다. 수정되었습니다.