Erros, bugs, perguntas - página 2359

 
A100:

Verifiquei-o especialmente para si, tendo em conta

Está tudo bem DJ.

Que compilador utiliza?

Estou no VS 2010:

binário '=' : não foi encontrado nenhum operador que aceite um operando à direita do tipo 'A' (ou não há conversão aceitável)

p.s. Não percebo bem o que significa "com consideração"? Tratava-se da aceitabilidade de copiar implicitamente uma classe base para uma classe derivada.

 

No Visual Studio, o meu exemplo também funciona. Referia-me ao operador da cópia explícita e expliquei-o através do código.

Escrevi-o só por precaução, para que, se desactivar o explícito, não o desactive acidentalmente ao mesmo tempo

 
A100:

No Visual Studio, o meu exemplo também funciona. Referia-me ao operador da cópia explícita e expliquei-o através do código.

Não estava a referir-me ao operador explícito. Estava a falar da inadmissibilidade do operador implícito neste caso a que chamou "estreiteza de visão" e não é assim.

Se precisar de fazer uma cópia, deve primeiro fazer o molde b explicitamente para o tipo correcto em C++. Para uma tal cópia é uma violação do encapsulamento de objectos. É por isso que não deve ser uma questão de implicação.

 
A100:

Referia-me a um operador de cópia explícita e expliquei-o em código.

A propósito, se a classe A também herdar de alguma classe X, então a sua classe B não está de modo algum protegida contra a cópia X (estamos a falar de MQL). Tem de escrever operadores para TODAS as classes-mãe.
 
A100:

Duvido que o compilador os separe (no contexto do código) em explícito e implícito. Caso contrário, seria fácil de reparar

A questão é que um operador implícito corresponde sempre ao tipo de um objecto. Ou seja, se um objecto é do tipo B, o seu operador implícito é do tipo const B&. Não é do tipo A. Mas este é do tipo C++.
 

A propósito, o tipo de operador parece estar OK

Primeiro procura o operador B:::, se estiver ausente, então procura o operador A:::, se também estiver ausente, então considera o seu dever cumprido e não faz nada (embora o ponteiro esteja quebrado como resultado) :)

 
Ilya Malev:

se também não estiver lá, então considera o seu dever cumprido e não faz nada (embora o ponteiro acabe por ser quebrado) :)

Porque é que não faz nada? Copia por operador implícito (automático)=(const A&), o que não deve fazer.

E finalmente remover esse asterisco depois de B, magoa os seus olhos ) Já descobrimos tudo com este insecto.

 
Alexey Navoykov:

E, finalmente, tirar esse asterisco depois de B, magoa o olho ) Já descobriu tudo com este insecto.

Eu pessoalmente encontro variáveis de objectos sem asteriscos perturbadores )) Um dos insectos desagradáveis é escrever A a=novo A em vez de *a e não compreender o que está errado durante muito tempo) Eu, pelo contrário, mostrei que tudo funciona correctamente se seguir os seus conselhos e declarar uma op.=&. O editor irá produzir um erro neste caso de imediato. Fá-lo-ei dessa forma a partir de agora ))

 
Passou algumas horas à procura de discrepâncias. Encontrei isto
#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  const double Koef =  0.25;
  const int iDelta = 32;
  const double point = 0.00001;
  
  const double high = 1.06736;
  const double low = 1.06676;
  
  const double Avg = (high + low) * 0.5;  
  const double Size = (high - low) * Koef * 0.5;  
  
  PRINT(DoubleToString(Avg - Size - point * iDelta, 5));   // DoubleToString(Avg-Size-point*iDelta,5) = 1.06666
  PRINT(DoubleToString(Avg - (Size + point * iDelta), 5)); // DoubleToString(Avg-(Size+point*iDelta),5) = 1.06667
} 


As peculiaridades são duplamente conhecidas, mas não de tal forma que se alterar a ordem de adição (excepto pelos números relativamente muito diferentes), o resultado é diferente! Por favor explique a um idiota porque é que isto acontece aqui?

Basta olhar para as duas linhas inferiores da fonte.

 

Erro para programadores.

O guião não compila, identifica o porquê))))). Utilizar ficheiro anexo.


O mesmo ficheiro:


Arquivos anexados:
Test1.mq5  9 kb