Erros, bugs, perguntas - página 1785

 
fxsaber:
Eu sei para que serve o destruidor. Não me parece claro por que razão a palavra virtual deve ser escrita antes da sua definição.
Preciso dele para compatibilidade de código com C++, porque os destruidores são diferentes lá
 
A100:
Preciso dele para compatibilidade de código com C++, porque os destruidores são diferentes lá
Já está, obrigado. Fazem muitas portas para a MQL5? - É por isso que os exemplos são tão específicos?
 
fxsaber:
Eu sei para que é utilizado o destruidor. Não compreendo porque é que temos de acrescentar a palavra virtual antes da sua definição.

Funções virtuais e destruidora >>>

A regra básica: se tiver pelo menos uma função virtual na sua classe, o destruidor também deve ser virtual. Lembre-se de que o destruidor não é virtual por defeito, por isso deve declará-lo explicitamente. Se não o fizer, tem quase a certeza de ter fugas de memória no seu programa. Mais uma vez, não é preciso muita inteligência para compreender porquê. Vejamos vários exemplos.

 
fxsaber:
Já está, obrigado. Fazem muitas portas para a MQL5? - É por isso que os exemplos são tão específicos?
Eu não porto muito. Específico apenas à primeira vista. Alguns "especialistas" escreveram aqui que mais de 3 classes derivadas são prejudiciais. Muitas vezes tenho apenas 3-4 classes base que precisam de uma inicialização adequada e só depois é que vêm os verdadeiros derivados.
 
int main()
{
    A * pA = new B;
    delete pA;
    return EXIT_SUCCESS;
}

Desta vez o objecto é construído como deve ser, mas quando é destruído, ocorre uma fuga de memória, porque o destruidor da classe derivada não é chamado.

A razão é que a eliminação é efectuada através de um ponteiro para uma classe base e o compilador utiliza a ligação antecipada para chamar o destruidor. O destruidor da classe de base não pode chamar o destruidor da classe derivada porque não sabe nada sobre ela. Como resultado, parte da memória atribuída para a classe derivada é irremediavelmente perdida.

Para evitar isto, o destruidor da classe base deve ser declarado como virtual.

Não compreendo arquitectonicamente porque é que, ao tornar virtual o destruidor de base, aparece informação sobre o destruidor derivado.

A forma como o entendo agora é que quando a base é virtual, ao definirmos um destruidor derivado, fazemos um substituto para o destruidor derivado em vez do destruidor de base. Mas então o destruidor de bases não deve ser chamado neste exemplo.

Obviamente, não compreendo como isto funciona. Nunca tive problemas com funções virtuais na MQL5. Gosto muito do OOP por causa deles. Pensei ter compreendido tudo. Agora tenho um dilema completo. Por favor, explique-me nos seus próprios termos.

 
A100:
Retratar pouco. Específico apenas à primeira vista. Alguns "especialistas" escreveram aqui que TUDO mais de 3 classes derivadas é prejudicial. Tenho frequentemente apenas 3-4 classes base para inicializar correctamente e só depois começam as verdadeiras derivadas
Gostaria de ver um exemplo de como os profissionais (do meu ponto de vista) escrevem na MQL5.
 
fxsaber:

Mas então o destruidor de bases não deve ser chamado neste exemplo.

É chamado implicitamente pelo destruidor derivado. Isto é de facto o que o torna diferente das simples funções virtuais.
 
Комбинатор:
É chamado implicitamente pelo destruidor derivado. É isso que na realidade o torna diferente das simples funções virtuais.
Obrigado. Acontece que o destruidor virtual não é apenas uma função virtual que é chamada enquanto um objecto está a ser destruído, mas alguma entidade mais complicada.
 
fxsaber:
Bem, ele tem de apagar o objecto) essa é a parte complicada
 
Alexey Kozitsyn:

SymbolInfoTick() erro que devolve dados irrelevantes - assinalar o excesso. Construir 1525 x64. Teste do indicador, não testou no Expert Advisor:

Real, Abertura, Servidor de Acesso V. Tristeza! Preste atenção ao problema, por favor. E também ao problema na aplicação#1598238 (a partir da página 10, post de2017.01.26 09:43).

Caros programadores, vamos arranjar os carrapatos! Código fornecido, aqui está - o problema, não há necessidade de procurar nada, apenas reagir e resolvê-lo!

Se substituirmos OnCalculate por OnTick, não ocorrem erros. O problema não está em SymbolInfoTick, o problema é que os indicadores estão configurados de forma torta para não saltar.