Erros, bugs, perguntas - página 1696

 
Stanislav Korotky:

Em primeiro lugar, não é claro se foi ou não feita uma tentativa de declarar o método como virtual. Se tiver de ser virtual, então escreva virtual na classe base, não na classe derivada (porque senão os apontadores de base serão rasgados para o método base mesmo que se coloque nele uma instância de classe derivada).

Se não quiser anular um método numa classe derivada, não o mencione de todo, e se o fizer, deve ser anulado com um corpo.

Finalmente, para esconder o método da classe derivada, é necessário introduzir uma classe intermédia onde se move o método para a área priivada ou torná-lo privado na classe base (mas então porque é que é virtual?).

Aqui está um exemplo

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class roditel
  {
public:

   virtual int one(void)
     {
      return 1;
     }
   virtual int two(void)
     {
      return 2;
     }
   virtual int three(void)
     {
      return 3;
     }
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class naslednic_1 : public roditel
  {
public:
   virtual int       two(void);
   virtual int       three(void);
  };

naslednic_1 go;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   go.two();
// 'two' - function must have a body    TEst.mq4        42      7
  }
//+------------------------------------------------------------------+
 
Vladimir Pastushak:

Aqui está um exemplo

Este exemplo é aproximadamente o mesmo que o primeiro ;-). Abriu a minha carta mas não a leu? O que pretende alcançar declarando de novo os métodos no descendente, mas não os definindo? Para chamar a implementação básica sem ter uma nova, não precisa de as mencionar no descendente.
 
Stanislav Korotky:
Este exemplo é aproximadamente o mesmo que o primeiro ;-). A minha carta foi aberta, mas não a leu? O que pretende alcançar com a redeclaração dos métodos no descendente, mas não a sua definição? Para chamar uma implementação básica sem ter uma nova, não precisa de as declarar na descendência.

Quero ver apenas 10 métodos herdados mais métodos criados na classe descendente. Não preciso de 190 métodos, que não terão qualquer relação com a classe actual.

Por exemplo, tenho uma classe base onde são descritas todas as propriedades máximas de formas, largura, altura, cantos, raios, cores, área.

Com base nestes métodos de propriedade, faço uma classe derivada de círculo que usa métodos de classe mãe, raio, cor, área... Mas eu não preciso de cantos e largura aqui ...

Com base nestes métodos, faço uma classe triangular descendente que usa métodos da classe dos pais, cor, área, cantos... Mas eu não preciso de raio aqui ...

Quando pergunto porquê, a classe mãe tem um grupo de métodos que são comuns a todos ou comuns a um grupo de formas, como cor, método de estilo.

 
Vladimir Pastushak:

Quero ver apenas 10 métodos herdados mais métodos criados na classe descendente. Não preciso de 190 métodos, que não terão qualquer relação com a classe actual.

Por exemplo, tenho uma classe base onde são descritas todas as propriedades máximas de formas, largura, altura, cantos, raios, cores, área.

Com base nestes métodos de propriedade, faço uma classe descendente que usa métodos de classe pai, raio, cor, área... Mas eu não preciso de cantos e largura aqui ...

Com base nestes métodos, faço uma classe triangular descendente que usa métodos da classe dos pais, cor, área, cantos... Mas eu não preciso de raio aqui ...

Quando perguntei porquê, a classe mãe tem um grupo de métodos que é comum a todos ou comum a um grupo de formas, por exemplo, cor do método, estilo.

Não compreendo: esta pergunta - uma pergunta ou uma resposta subscrita? Normalmente fazem-no - na classe de base é comum, e depois, nos descendentes, acrescentam pormenores. Porquê fazer o contrário? Qual é o objectivo?

Mas mesmo que não se vá mais fundo, já sugeri uma opção - inserir um descendente intermédio em que todas as propriedades e métodos desnecessários são movidos para a parte privada.

 
Pergunta para a administração, quando será possível ver as novas estatísticas actualizadas para os serviços?
 
Vladimir Pastushak:

Existem 200 métodos na classe dos pais, quero ver apenas 10 métodos herdados mais os criados na classe das crianças, não preciso de mais 190 métodos que não estejam relacionados com a classe actual.

Para o fazer, é necessário declarar a herança como protegida ou privada. E depois anular os métodos de que necessita.

class naslednic_1 : protected roditel
  {
public:
   virtual int       two(void)   { return roditel::two(); }
   virtual int       three(void) { return roditel::three(); }
  };
 
Alexey Navoykov:

Para o fazer, é preciso declarar a herança como protegida ou privada. E depois anular os métodos que se pretende.

Stanislav Korotky:

Não compreendo: esta pergunta é uma pergunta ou uma resposta incompleta? Normalmente fazem-no desta forma - numa classe de base o geral, e depois, nos descendentes, acrescentam pormenores. Porquê fazer o oposto? Qual é o objectivo?

Mas mesmo que não se vá muito fundo, já sugeri uma opção - inserir um descendente intermédio em que todas as propriedades e métodos desnecessários são movidos para a parte privada.

Obrigado.

Alexey, o seu exemplo não funciona, em qualquer caso, a criança recebe métodos dos pais, que não devem ser abandonados.


 
Como conheço o meuINDICADOR_SHORTNAME? IndicatorGet*-funções estão em falta!
 
Alexey Kozitsyn:
E se mudar o nome curto quando o criar?

E mudar sempre?

Se o indicador contiver buffers indicadores, a auto-identificação é fácil, mas sem buffers, ainda não vejo uma solução.

 
fxsaber:
Como conheço o meuINDICADOR_SHORTNAME? IndicatorGet*-funções não existem!
Print(MQLInfoString(MQL_PROGRAM_NAME)); devolve o nome curto do indicador. Se não for especificado um nome abreviado - o nome completo é devolvido.