class A { public:
virtualvoid f() { Print( __FUNCTION__ ); }
};
class B : public A { public:
virtualvoid f() { Print( __FUNCTION__ ); }
};
class H { public:
H( A* a ) { H::s[ 0 ] = a; }
staticvoid g();
static A* s[ 1 ];
};
A *H::s[ 1 ] = { 0 };
void H::g() { H::s[ 0 ].f(); } //еще обратил внимание, что в этом месте редактор выделяет (.f) зеленым
voidOnStart()
{
A* b = new B();
H h( b );
H::g(); //печатает A::f()
delete( b );
}
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?
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 976void 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 )
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.
Um erro no funcionamento das funções virtuais
Resultado: A::f(), deve ser B::f()
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*/
2 - Antes da depuração.
3 - depois.
Talvez haja diferenças, eu não entendo nada)
Muito obrigado)
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á
Um erro no funcionamento das funções virtuais
Resultado: A::f(), deve ser B::f()
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á
Erro de compilação 358 em todos os casos de chamada 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).
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 )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.