Em compilações recentes, adicionamos uma mensagem ao compilador para os casos em que um método ancestral é sobrecarregado em um descendente:
Exemplo
Nesse caso, a função func(int) do ancestral SFoo é chamada na classe descendente SBar porque o compilador não a encontrou no descendente. O descendente tem apenas a função func(double) e o compilador tenta encontrar uma função com um parâmetro adequado na árvore de herança.
Ou seja, o compilador MQL5 executa a sobrecarga em vez de substituir o método no descendente. No início do desenvolvimento da linguagem, esse relaxamento do compilador MQL5 não foi considerado crítico. Mas ele pode ser alterado no futuro, portanto, agora é emitido um aviso explícito para que os desenvolvedores de programas MQL5 levem em conta e corrijam seus códigos.
Em termos estritos, a substituição é um conceito um pouco mais amplo. Você pode pesquisar a diferença entre sobrecarga e substituição na Internet .
1. É correto que esse código não seja compilado?
class CA
{
public:
void func( void ) { Print( __FUNCSIG__ ); };
};
class CB : CA
{
public:
//void func( void ) { CA::func(); }; }; // não será compilado sem essa linha
};
class CC
{
public:
CB m_b;
CC(void) { m_b.func(); }
};
voidOnStart()
{
CC c;
}
'CA::func' - cannot access private member function TestCompiler.mq5 27 18
see declaration of 'CA::func' TestCompiler.mq5 13 8
1 error(s), 0 warning(s) 2 1
2. É correto que esse código, além do erro mencionado acima, gera o aviso "deprecated behaviour, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18"?
class CA
{
public:
void func( void ) { Print( __FUNCSIG__ ); };
};
class CB : CA
{
public:
//void func( void ) { CA::func(); }; }; // não será compilado sem essa linhabool func( int a ) { return(true); };
};
class CC
{
public:
CB m_b;
CC(void) { m_b.func(); }
};
voidOnStart()
{
CC c;
}
1. É correto afirmar que esse código não é compilado?
2. É correto que esse código, além do erro acima, gera o aviso "deprecated behaviour, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18"?
Talvez seja melhor perguntar isso no tópico sobre a nova versão do terminal? ) Acho que a resposta será mais rápida lá.)
O aviso parece se encaixar na nova lógica do compilador, mas não entendo sobre o membro privado, ele ainda é público...
O autor provavelmente já "terminou" esse projeto. Você poderia especificar em quais linhas o que escrever para que o compilador não pragueje e, melhor ainda, os arquivos ortodoxos (corrigidos) ( ElementBase.mqh e Element.mqh) para as pessoas
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Tentei alterar o arquivo ElementBase.mqh, mas ele se torna ainda mais irritante.
Tentei alterar o arquivo ElementBase.mqh, mas ele se torna ainda mais irritante.
Tanto o ElementBase.mqh quanto o Element.mqh precisam ser alterados.
Em compilações recentes, adicionamos uma mensagem ao compilador para os casos em que um método ancestral é sobrecarregado em um descendente:
Exemplo
Nesse caso, a função func(int) do ancestral SFoo é chamada na classe descendente SBar porque o compilador não a encontrou no descendente. O descendente tem apenas a função func(double) e o compilador tenta encontrar uma função com um parâmetro adequado na árvore de herança.
Ou seja, o compilador MQL5 executa a sobrecarga em vez de substituir o método no descendente. No início do desenvolvimento da linguagem, esse relaxamento do compilador MQL5 não foi considerado crítico. Mas ele pode ser alterado no futuro, portanto, agora é emitido um aviso explícito para que os desenvolvedores de programas MQL5 levem em conta e corrijam seus códigos.
Em termos estritos, a substituição é um conceito um pouco mais amplo. Você pode pesquisar a diferença entre sobrecarga e substituição na Internet
.
1. É correto que esse código não seja compilado?
2. É correto que esse código, além do erro mencionado acima, gera o aviso "deprecated behaviour, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18"?
1. É correto afirmar que esse código não é compilado?
2. É correto que esse código, além do erro acima, gera o aviso "deprecated behaviour, hidden method calling will be disabled in a future MQL compiler version TestCompiler.mq5 27 18"?
Talvez seja melhor perguntar isso no tópico sobre a nova versão do terminal? ) Acho que a resposta será mais rápida lá.)
O aviso parece se encaixar na nova lógica do compilador, mas não entendo sobre o membro privado, ele ainda é público...
Tanto o ElementBase.mqh quanto o Element.mqh precisam ser alterados
No ElementBase.mqh, está claro que você substituiu "Is" por "Set" (mas não está claro por que podemos fazer isso).
Mas em Element.mqh há outra linha
Em ElementBase.mqh, está claro que você substituiu "Is" por "Set" (mas não está claro por que podemos fazer isso)
mas em Element.mqh há outra linha
Bem, agora o MQ não gosta dos mesmos nomes (variáveis, métodos, etc.) :)
Apenas alteramos o nome do método (e por que não? ) ) )
Não queremos mudar nada - esperamos que o autor refaça tudo )
O autor provavelmente já "terminou" esse projeto. Você poderia especificar em quais linhas o que escrever para que o compilador não pragueje e, melhor ainda, os arquivos ortodoxos (corrigidos) ( ElementBase.mqh e Element.mqh) para as pessoas
1. Estou no meio de outro projeto no momento.
2. Mudei muito a biblioteca)
Bem, além das alterações em ElementBase.mqh e Element.mqh, você deve examinar todos os elementos, talvez haja esses métodos lá também.
Talvez seja melhor fazer a pergunta no tópico sobre a nova versão do terminal? ) Acho que eles responderão mais rápido lá.)
O aviso parece se encaixar na nova lógica do compilador, mas não entendo sobre o membro privado, ele ainda é público...
Encontrei uma solução alternativa para isso:
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
Nova versão do MetaTrader 4 build 1170
fxsaber, 2019.09.06 09:39 pm.
Acredito que a opção proposta no MT5 é uma inovação que também deve ser adicionada ao MT4.
Mas se você escrever o código da maneira antiga, ele funcionará em todos os lugares.
É assim que meu exemplo funciona:
CC(void) { ((CA)m_b).func(); }Mas isso não é uma solução, é claro.
@Ilyas, não há opção sem conversão para CA?