Fehler, Irrtümer, Fragen - Seite 2359

 
A100:

Ich habe sie speziell für Sie überprüft, wobei ich Folgendes berücksichtigt habe

Es ist OK, DJ.

Welchen Compiler verwenden Sie?

Ich arbeite mit VS 2010:

binary '=' : kein Operator gefunden, der einen rechten Operanden vom Typ 'A' annimmt (oder es gibt keine akzeptable Umwandlung)

p.s. Ich verstehe nur nicht so recht, was "mit Rücksicht" bedeutet? Es ging um die Zulässigkeit des impliziten Kopierens einer Basisklasse in eine abgeleitete Klasse.

 

In Visual Studio funktioniert mein Beispiel auch. Ich meinte den expliziten Kopieroperator und habe ihn anhand des Codes erklärt.

Ich habe ihn nur für den Fall geschrieben, dass Sie die explizite Funktion deaktivieren, damit Sie nicht versehentlich auch die andere Funktion deaktivieren.

 
A100:

In Visual Studio funktioniert mein Beispiel auch. Ich meinte den expliziten Kopieroperator und habe ihn anhand des Codes erklärt.

Ich habe mich nicht auf den expliziten Operator bezogen, sondern auf die Unzulässigkeit des impliziten Operators in diesem Fall, den Sie als "Engstirnigkeit" bezeichnet haben, und das ist nicht der Fall.

Wenn Sie eine Kopie erstellen müssen, müssen Sie zunächst b explizit auf den richtigen Typ in C++ casten. Denn ein solches Kopieren ist eine Verletzung der Objektkapselung. Deshalb sollte es nicht um Andeutungen gehen.

 
A100:

Ich meinte einen expliziten Kopieroperator und habe ihn im Code erklärt.

Übrigens, wenn Klasse A auch von einer Klasse X erbt, dann ist Ihre Klasse B in keiner Weise davor geschützt, X zu kopieren (wir sprechen von MQL). Sie müssen Operatoren für ALLE Elternklassen schreiben.
 
A100:

Ich bezweifle, dass der Compiler sie (im Kontext des Codes) in explizit und implizit trennt. Andernfalls wäre es einfach, sie zu reparieren.

Der Punkt ist, dass ein impliziter Operator immer dem Typ eines Objekts entspricht, d.h. wenn ein Objekt vom Typ B ist, ist sein impliziter Operator vom Typ const B&. Er nimmt nicht den Typ A. Aber das ist C++.
 

Übrigens scheint der Operatortyp in Ordnung zu sein

Zuerst sucht er nach dem Operator B::, wenn er nicht vorhanden ist, dann sucht er nach dem Operator A::, wenn er auch dort nicht vorhanden ist, dann betrachtet er seine Aufgabe als erfüllt und tut nichts (obwohl der Zeiger dadurch kaputt ist) :)

 
Ilya Malev:

Wenn er auch nicht da ist, betrachtet er seine Aufgabe als erfüllt und tut nichts (obwohl der Zeiger am Ende kaputt ist) :)

Warum tut es nichts? Sie kopiert durch implizites (automatisches) operator=(const A&), was sie nicht tun sollte.

Und entfernen Sie endlich das Sternchen nach dem B, es tut in den Augen weh) Wir haben bereits alles mit diesem Fehler herausgefunden.

 
Alexey Navoykov:

Und nimm endlich das Sternchen nach dem B weg, das tut dem Auge weh) Es hat schon alles mit diesem Fehler herausgefunden.

Ich persönlich finde Objektvariablen ohne Sternchen störend )) Einer der üblen Fehler ist, A a=new A statt *a zu schreiben und lange Zeit nicht zu verstehen, was falsch ist). Ich habe im Gegenteil gezeigt, dass alles korrekt funktioniert, wenn man Ihren Rat befolgt und ein privates op.=& deklariert. Der Editor wird in diesem Fall sofort einen Fehler ausgeben. Ich werde es von nun an so machen ))

 
Ich habe ein paar Stunden damit verbracht, nach Unstimmigkeiten zu suchen. Dies gefunden
#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
} 


Die Besonderheiten doppelt wissen, aber nicht so, dass wenn man die Reihenfolge der Addition ändert (außer bei den relativ sehr unterschiedlichen Zahlen), das Ergebnis anders ist! Bitte erklären Sie einem Dummkopf, warum das hier passiert?

Sie brauchen sich nur die beiden untersten Zeilen des Quelltextes anzusehen.

 

Fehler für Entwickler.

Das Skript lässt sich nicht kompilieren, ermitteln Sie den Grund))). Verwenden Sie die angehängte Datei.


Dieselbe Datei:


Dateien:
Test1.mq5  9 kb