エラー、バグ、質問 - ページ 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()のはず。

 
市場のスパマーをどうするか?私は苦情を言い、スパマーは1日追放され、今は追放が解かれましたが、彼の糞はまだそこにあります。それとも普通?製品ディスカッションページは、お客様の声を聞くためのものではありませんか?
 
Motoellesse:

META TRADER 4をOS MAVERICKSにインストールするのを手伝ってください。すべてのプログラムをダウンロードし、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に従うべきでないが

また、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に従うべきでないが

また、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 でも修正されていますが、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 ) が宣言されたときにのみ変更することが可能です。
投稿ありがとうございます、修正しました。