Discussão do artigo "Interfaces gráficas XI: Integração da Biblioteca Gráfica Padrão (build 16)" - página 8

 
Oleksii Chepurnyi:

Tentei alterar o arquivo ElementBase.mqh, mas ele se torna ainda mais irritante.

 
Pavel Kolchin:

Tentei alterar o arquivo ElementBase.mqh, mas ele se torna ainda mais irritante.

Tanto o ElementBase.mqh quanto o Element.mqh precisam ser alterados.

 
MetaQuotes Software Corp.:

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

void OnStart()
{       
        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 linha
                bool func( int a ) { return(true); };
};

class CC
{
        public:
                CB m_b;
                CC(void) { m_b.func(); }
};

void OnStart()
{       
        CC c;
}

 
Andrey Khatimlianskii:

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...

 
Oleksii Chepurnyi:

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).

virtual void      Set Available(const bool state)                  { m_is_available=state;                 }
bool              IsAvailable(void)                         const { return(m_is_available);               }

Mas em Element.mqh há outra linha

//--- Disponibilidade do item
virtual void      IsAvailable(const bool state);
 
Pavel Kolchin:

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 )

 
Oleksii Chepurnyi:

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.

 
Oleksii Chepurnyi:

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.

     void           Test(const bool test){((A)b).Test(test);}

É 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?