Errores, fallos, preguntas - página 1201

 

Un error en el funcionamiento de las funciones virtuales

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

Resultado: A::f(), debería ser B::f()

 
¿Qué hacer con los spammers en el mercado? Me quejé, el spammer fue baneado durante 24 horas, ahora ha sido desbaneado, pero su mierda sigue ahí. ¿O es normal? ¿No es la página de discusión del producto para los comentarios de los clientes?
 
Motoellesse:

Ayuda para instalar META TRADER 4 en OS MAVERICKS, DESCARGADO TODOS LOS PROGRAMAS, JUGAR EN MAC, TODO NUEVO, TODO DA ERROR.

/*moderador: enviar el texto del error como un archivo*/

 
Motoellesse:

2 - Antes de la depuración.

3 - después.

Tal vez haya diferencias allí, no entiendo nada en absoluto)

Muchas gracias)

Archivos adjuntos:
 

Error de compilación

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

mientras que const no debe seguir estática

Además, se trata de una protección falsa, ya que static se modifica con la función habitual h() y A::f() const ni siquiera lo sabrá

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

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

Un error en el funcionamiento de las funciones virtuales

Resultado: A::f(), debería ser B::f()

Gracias por el post, arreglado.
 
A100:

Error de compilación

mientras que const no debe seguir estática

Además, se trata de una protección falsa, ya que static se modifica con la función habitual h() y A::f() const ni siquiera lo sabrá

Gracias por el post, arreglado.
 

Error de compilación 358 en todos los casos de llamada a 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 )
{
}

Sólo se justifica en (3) y (4) porque no es h( const A* a)

Una situación similar se corrigió anteriormente https://www.mql5.com/ru/forum/1111/page1218#comment_1058402 pero la razón es probablemente diferente ya que la presencia de const en la declaración void f() const influye en la aparición de errores y no había funciones miembro allí

 

No compila en la compilación 976 (error 358, pero difiere de los errores descritos anteriormente en la compilación 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 razón podría ser que la compilación 976 arregló el error relacionado con el hecho de que una función normal llamada desde un método de clase const podía modificar los miembros de la clase que se le pasaban por una referencia no-const&. Pero aquí el puntero es un miembro de la clase y se garantiza que su valor no se modificará al llamar a h( A* a), sino que sólo podrá modificarse al declarar h( A* &a )
 
A100:

No compila en la compilación 976 (error 358, pero difiere de lo descrito anteriormente en que no se produjeron errores en la compilación 975)

La razón podría ser que la compilación 976 arregló el error relacionado con el hecho de que una función normal llamada desde un método de clase const podía modificar los miembros de la clase que se le pasaban por una referencia no-const&. Pero aquí el puntero es un miembro de la clase y se garantiza que su valor no cambiará cuando se llame a h( A* a), sino que sólo podrá cambiarse cuando se declare h( A* &a ).
Gracias por el post, arreglado.