MQL5 Der Compiler unterscheidet nicht zwischen einer Klasse und einem Zeiger auf sie - Seite 7

 
Alexey Navoykov:
Sie schlagen also vor, die implizite Benennung von Zeigern gänzlich zu verbieten? Ich glaube nicht, dass viele hier darüber glücklich wären.

Jeder soll die Wahl haben.

#property strict

Diese Art von Trick möchte ich auf keinen Fall.

 
SemenTalonov:

Nun, das versteht sich von selbst. Es gibt ein Speicherleck.

Ein Speicherleck, sagen Sie? Wie wäre es damit? )))

#property strict

class A
 {
  A*  item;
  int num;
public:
  A(int p=10){num=p;item=NULL;} ~A(){if(CheckPointer(item)==POINTER_DYNAMIC) delete item;}
  A* operator=(A* par){ item = par; return&this; }
  A* operator~(){ return item; }
  int operator-(){ return num; }
 };

void OnStart()
 {
  A a = new A(20);
  printf("В автообъекте %i (%i) сохранен динамический объект %i (%i), который он в конце своего цикла сам уничтожает...",&a,-a,~a,-~a);
 }


 
Ilya Malev:

Ein Speicherleck, sagen Sie? Wie wäre es damit? )))


delete item;

Sie setzt also voraus, dass das Subjekt bereit ist, auf diese Weise behandelt zu werden. Wie viele sehen diese Möglichkeit voraus?

 
SemenTalonov:

Dies setzt also voraus, dass das Objekt bereit ist, auf diese Weise behandelt zu werden. Sehen viele Menschen eine solche Möglichkeit vor?

Ich denke, wenn jemand das Wort new schreibt, sollte er genau wissen, wo das entsprechende Wort delete an anderer Stelle in seinem Code steht.

 
Diese Konstruktion wird übrigens, wenn auch etwas verfeinert, als "Müllsammler" bezeichnet)))
 
SemenTalonov:

Jeder soll die Wahl haben.

Solche Tricks brauche ich sicher nicht.

Ich verwende es bereits in MQL4. Wie wird es dann funktionieren, wenn die Sprachsyntax dieselbe ist?

Nun, zum Schutz vor solchen Aktionen kann man eine private Methode in einer Klasse erstellen:

class A
{
 private: void operator=(const A*);
}

Obwohl ich hier, ehrlich gesagt, kein Problem sehe: Wenn man einem Klassenobjekt etwas zuweist, erwartet man a priori, dass der Kopieroperator aufgerufen wird. Sie wollen es, Sie bekommen es. Was macht es für einen Unterschied, ob es sich um einen Zeiger oder ein Objekt handelt? Der Klassentyp ist derselbe. Sie können keine linkshändige Klasse zuweisen. Deshalb sieht das Ganze eher nach einer Leerlaufbohrung aus.

Der umgekehrte Fall, mit dem Zeiger auf der linken Seite, ist eine andere Sache: Hier hätte man erwarten können, dass dem Zeiger etwas zugewiesen wird, aber es stellte sich heraus, dass es sich um das Kopieren eines Objekts handelt.

 
Alexey Navoykov:

Der umgekehrte Fall, mit dem Zeiger auf der linken Seite, ist anders: Dort könnte man erwarten, dass man dem Zeiger etwas zuweist, aber es stellt sich heraus, dass man ein Objekt kopiert.

Und das kann man nicht verbieten, sonst kann man das Objekt nicht kopieren, wenn man es wirklich braucht.

Daher müssen Sie alles so lassen, wie es ist. Seien Sie sich einfach bewusst, was Sie tun.

 
fxsaber:

Und Sie können es nicht verbieten, sonst können Sie das Objekt nicht kopieren, wenn Sie es wirklich brauchen.

Letztendlich muss man es so lassen, wie es ist. Sei dir einfach bewusst, was du tust.

О! Das ist die Hauptsache.

Gibt es hier viele Leute, die wissen, wie man sich in den Modi der Speicherverwaltung zurechtfindet? Den Unterschied zwischen AUTOMATIK und DYNAMIK verstehen.

Und ich habe etwas über STATIC und BASED gehört (obwohl das nicht notwendig ist).

 
fxsaber:

Und Sie können es nicht verbieten, sonst können Sie das Objekt nicht kopieren, wenn Sie es wirklich brauchen.

Letztendlich muss man es so lassen, wie es ist. Seien Sie sich einfach bewusst, was Sie tun.

Es gibt die Operatoren * und &, mit denen man in das umwandeln kann, was man braucht.
 
Alexey Navoykov:
Warum kann es nicht funktionieren? Es gibt * und & Operatoren, um es auf das Notwendige zu reduzieren.

Wo befindet sich ein *?