Errori, bug, domande - pagina 2359

 
A100:

L'ho ricontrollato appositamente per te, tenendo conto di

Va bene DJ.

Che compilatore usi?

Sono su VS 2010:

binario '=' : nessun operatore trovato che prenda un operando di destra di tipo 'A' (o non c'è conversione accettabile)

p.s. Non capisco bene cosa significa "con considerazione"? Si trattava dell'accettabilità di copiare implicitamente una classe base in una classe derivata.

 

Anche in Visual Studio il mio esempio funziona. Intendevo l'operatore di copia esplicita e l'ho spiegato con il codice.

L'ho scritto solo in caso, in modo che se si disattiva quello esplicito, non lo si disattiva accidentalmente allo stesso tempo

 
A100:

Anche in Visual Studio il mio esempio funziona. Intendevo l'operatore di copia esplicita e l'ho spiegato con il codice.

Non mi riferivo all'operatore esplicito, ma all'inammissibilità dell'operatore implicito in questo caso che lei ha chiamato "ristrettezza di vedute" e non è così.

Se avete bisogno di fare una copia, dovete prima lanciare esplicitamente b al tipo corretto in C++. Perché una tale copia è una violazione dell'incapsulamento degli oggetti. Ecco perché non dovrebbe trattarsi di implicazioni.

 
A100:

Intendevo un operatore di copia esplicito e l'ho spiegato nel codice.

A proposito, se la classe A eredita anche da qualche classe X, allora la vostra classe B non è in alcun modo protetta dalla copia di X (stiamo parlando di MQL). Dovete scrivere operatori per TUTTE le classi madri.
 
A100:

Dubito che il compilatore li separi (nel contesto del codice) in espliciti e impliciti. Altrimenti sarebbe facile aggiustarlo

Il punto è che un operatore implicito corrisponde sempre al tipo di un oggetto. Cioè se un oggetto è di tipo B, il suo operatore implicito è di tipo const B&. Non prende il tipo A. Ma questo è C++.
 

A proposito, il tipo di operatore sembra essere OK

Prima cerca l'operatore B::, se è assente, poi cerca l'operatore A::, se è assente anche lì, allora considera fatto il suo dovere e non fa nulla (anche se il puntatore è rotto come risultato) :)

 
Ilya Malev:

se non c'è nemmeno lì, allora considera il suo dovere fatto e non fa nulla (anche se il puntatore alla fine è rotto) :)

Perché non fa niente? Copia per implicito (automatico) operator=(const A&), cosa che non dovrebbe fare.

E infine togliete quell'asterisco dopo la B, fa male agli occhi) Abbiamo già capito tutto con questo bug.

 
Alexey Navoykov:

E infine togliete quell'asterisco dopo la B, fa male all'occhio ) Ha già capito tutto con questo bug.

Personalmente trovo fastidiose le variabili oggetto senza asterischi )) Uno dei brutti bug è scrivere A a=new A invece di *a e non capire cosa c'è di sbagliato per molto tempo) io, al contrario, ho dimostrato che tutto funziona correttamente se si segue il tuo consiglio e si dichiara un op.=& privato. L'editor produrrà subito un errore in questo caso. Farò così d'ora in poi ))

 
Ho passato qualche ora a cercare le discrepanze. Ho trovato questo
#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
} 


Le peculiarità doppie si conoscono, ma non tali che se si cambia l'ordine di addizione (tranne che per i numeri relativamente molto diversi), il risultato è diverso! Per favore, spiegate a un pazzo perché questo accade qui?

Basta guardare le due righe in basso nella fonte.

 

Errore per gli sviluppatori.

Lo script non si compila, identificarne il motivo)). Utilizzare il file allegato.


Stesso file:


File:
Test1.mq5  9 kb
Motivazione: