Errori, bug, domande - pagina 1201

 

Un errore nel funzionamento delle funzioni virtuali

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

Risultato: A::f(), dovrebbe essere B::f()

 
Cosa fare con gli spammer nel mercato? Mi sono lamentato, lo spammer è stato bannato per 24 ore, ora è stato unbannato, ma la sua merda è ancora lì. O è normale? La pagina di discussione del prodotto non è per il feedback dei clienti?
 
Motoellesse:

Aiuto installare META TRADER 4 su OS MAVERICKS, SCARICATO TUTTI I PROGRAMMI, GIOCARE SU MAC, TUTTO NUOVO, QUALSIASI COSA Dà ERRORE.

/*moderatore: inviare il testo dell'errore come file*/

 
Motoellesse:

2 - Prima del debug.

3 - dopo.

Forse lì ci sono delle differenze, io non ci capisco niente)

Grazie mille)

File:
 

Errore di compilazione

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

mentre const non dovrebbe seguire static

Inoltre, questa è una protezione fasulla, perché static è modificato dalla solita funzione h() e A::f() const non lo saprà nemmeno

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

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

Un errore nel funzionamento delle funzioni virtuali

Risultato: A::f(), dovrebbe essere B::f()

Grazie per il post, risolto.
 
A100:

Errore di compilazione

mentre const non dovrebbe seguire static

Inoltre, questa è una protezione fasulla, perché static è modificato dalla solita funzione h() e A::f() const non lo saprà nemmeno

Grazie per il post, risolto.
 

Errore di compilazione 358 in tutti i casi di chiamata 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 )
{
}

È giustificato solo in (3) e (4) perché non è h( const A* a)

Una situazione simile è stata corretta in precedenza https://www.mql5.com/ru/forum/1111/page1218#comment_1058402 ma la ragione è probabilmente diversa poiché la presenza di const nella dichiarazione void f() const influenza il verificarsi dell'errore e non c'erano funzioni membro lì

 

Non compila nella build 976 (errore 358, ma differisce dagli errori precedentemente descritti nella 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;
};
La ragione potrebbe essere che la build 976 ha corretto l'errore relativo al fatto che una normale funzione chiamata da un metodo di classe const potrebbe modificare i membri della classe passati ad essa da un riferimento non-const&. Ma qui il puntatore è un membro della classe e il suo valore è garantito per non essere cambiato quando si chiama h( A* a), ma può essere cambiato solo quando si dichiara h( A* &a )
 
A100:

Non compila nella build 976 (errore 358, ma differisce dalla descrizione precedente in quanto nessun errore si è verificato nella build 975)

La ragione potrebbe essere che la build 976 ha corretto l'errore relativo al fatto che una normale funzione chiamata da un metodo di classe const potrebbe modificare i membri della classe passati ad essa da un riferimento non-const&. Ma qui il puntatore è un membro della classe e il suo valore è garantito per non essere cambiato quando si chiama h( A* a) ma può essere cambiato solo quando si dichiara h( A* &a )
Grazie per il post, risolto.