Fehler, Irrtümer, Fragen - Seite 1201

 

Ein Fehler in der Bedienung der virtuellen Funktionen

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 );
}

Ergebnis: A::f(), sollte B::f() sein

 
Was soll man mit Spammern auf dem Markt tun? Ich habe mich beschwert, der Spammer wurde für 24 Stunden gesperrt, jetzt wurde die Sperre aufgehoben, aber sein Mist ist immer noch da. Oder ist das normal? Ist die Produktdiskussionsseite nicht für Kundenfeedback gedacht?
 
Motoellesse:

Hilfe bei der Installation von META TRADER 4 auf OS MAVERICKS, ALLE PROGRAMME HERUNTERGELADEN, AUF MAC SPIELEN, ALLES NEU, ALLES GEBT FEHLERHAFT.

/*Moderator: Senden Sie den Fehlertext als Datei*/

 
Motoellesse:

2 - Vor der Fehlersuche.

3 - danach.

Vielleicht gibt es da Unterschiede, ich verstehe überhaupt nichts)

Herzlichen Dank)

Dateien:
 

Kompilierungsfehler

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

während const nicht statisch folgen sollte

Außerdem handelt es sich um einen Scheinschutz, da static durch die übliche h()-Funktion geändert wird und A::f() const nicht einmal davon erfährt

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

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

Ein Fehler in der Bedienung der virtuellen Funktionen

Ergebnis: A::f(), sollte B::f() sein

Danke für den Beitrag, korrigiert.
 
A100:

Kompilierungsfehler

während const nicht statisch folgen sollte

Außerdem handelt es sich um einen Scheinschutz, da static durch die übliche h()-Funktion geändert wird und A::f() const nicht einmal davon erfährt

Danke für den Beitrag, korrigiert.
 

Kompilierungsfehler 358 in allen Fällen des Aufrufs von h( A* a)

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 )
{
}

Sie ist nur in (3) und (4) gerechtfertigt, da es sich nicht um h( const A* a)

Eine ähnliche Situation wurde früher korrigiert https://www.mql5.com/ru/forum/1111/page1218#comment_1058402 aber der Grund ist wahrscheinlich anders, da das Vorhandensein von const in der void f() const Deklaration das Auftreten von Fehlern beeinflusst und es keine Mitgliedsfunktionen gab

 

Er lässt sich in Build 976 nicht kompilieren (Fehler 358, unterscheidet sich aber von den zuvor beschriebenen Fehlern in Build 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;
};
Der Grund dafür könnte sein, dass Build 976 den Fehler behoben hat, der damit zusammenhängt, dass eine normale Funktion, die von einer const-Klassenmethode aufgerufen wird, Klassenmitglieder ändern kann, die ihr durch eine nicht-const&-Referenz übergeben werden. Hier ist der Zeiger jedoch ein Klassenmitglied und sein Wert wird beim Aufruf von h( A* a) garantiert nicht geändert, sondern kann nur bei der Deklaration von h( A* &a ) geändert werden.
 
A100:

Lässt sich in Build 976 nicht kompilieren (Fehler 358, aber anders als zuvor beschrieben, traten in Build 975 keine Fehler auf)

Der Grund dafür könnte sein, dass Build 976 den Fehler behoben hat, der damit zusammenhängt, dass eine normale Funktion, die von einer const-Klassenmethode aufgerufen wird, Klassenmitglieder ändern kann, die ihr durch eine nicht-const&-Referenz übergeben werden. Hier ist der Zeiger jedoch ein Klassenmitglied und sein Wert wird garantiert nicht geändert, wenn h( A* a) aufgerufen wird, sondern kann nur geändert werden, wenn h( A* &a ) deklariert wird.
Danke für den Beitrag, korrigiert.