Erros, bugs, perguntas - página 1201

 

Um erro no funcionamento das funções virtuais

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(), deve ser B::f()

 
O que fazer com os spammers no mercado? Reclamei, o spammer foi banido durante 24 horas, agora não foi banido, mas a sua merda ainda lá está. Ou é normal? A página de discussão do produto não é para feedback do cliente?
 
Motoellesse:

Ajude a instalar o META TRADER 4 em OS MAVERICKS, DOWNLOADED ALL PROGRAMS, PLAY ON MAC, ALL NEW, ANYTHING GIVES ERROR.

/*moderador: enviar o texto de erro como um ficheiro*/

 
Motoellesse:

2 - Antes da depuração.

3 - depois.

Talvez haja diferenças, eu não entendo nada)

Muito obrigado)

Arquivos anexados:
 

Erro de compilação

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

enquanto const não deve seguir a estática

Além disso, isto é uma protecção falsa, porque a estática é modificada pela função h() habitual e A::f() const nem sequer saberá

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

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

Um erro no funcionamento das funções virtuais

Resultado: A::f(), deve ser B::f()

Obrigado pelo correio, fixado.
 
A100:

Erro de compilação

enquanto const não deve seguir a estática

Além disso, isto é uma protecção falsa, porque a estática é modificada pela função h() habitual e A::f() const nem sequer saberá

Obrigado pelo correio, fixado.
 

Erro de compilação 358 em todos os casos de chamada 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 )
{
}

Justifica-se apenas em (3) e (4) porque não é h( const A* a)

Uma situação semelhante foi corrigida anteriormente https://www.mql5.com/ru/forum/1111/page1218#comment_1058402 mas a razão é provavelmente diferente, uma vez que a presença de const in void f() const influencia a ocorrência de erros e não havia lá funções de membro

 

Não compila na construção 976 (erro 358, mas difere dos erros anteriormente descritos na construção 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;
};
A razão pode ser que a construção 976 corrigiu o erro relacionado com o facto de que uma função normal chamada a partir de um método de classe const const poderia modificar os membros da classe que lhe foram passados por uma referência não const&. Mas aqui o ponteiro é um membro da classe e o seu valor é garantido não ser alterado ao chamar h( A* a), mas só pode ser alterado ao declarar h( A* &a )
 
A100:

Não compila na construção 976 (erro 358, mas difere do anteriormente descrito na medida em que não ocorreram erros na construção 975)

A razão pode ser que a construção 976 corrigiu o erro relacionado com o facto de que uma função normal chamada a partir de um método de classe const const poderia modificar os membros da classe que lhe foram passados por uma referência não const&. Mas aqui o ponteiro é um membro da classe e o seu valor é garantido não ser alterado quando h( A* a) é chamado mas só pode ser alterado quando h( A* &a ) é declarado.
Obrigado pelo correio, fixado.