PLO. Fragen zur Anwendung - Seite 7

 
equivalent23:

Ja, natürlich:

Ich erkannte, dass das Problem darin besteht,das Array shapes[10]korrekt mit Instanzen von Klassen zufüllen, die von CShape abgeleitet sind. Die von mir vorgeschlagene Option funktioniert aus irgendeinem Grund nicht. Lasst uns nachdenken.
 
Yedelkin:
Ich erkannte, dass das Problem darin besteht, das Array shapes[10] mit Instanzen von Klassen, die von CShape abgeleitet sind,korrekt zu füllen. Die von mir vorgeschlagene Variante funktioniert aus irgendeinem Grund nicht. Lasst uns nachdenken.

Das Array muss vom Typ Klassenzeiger sein, nicht vom Typ Klasse selbst.

Dann können wir den neuen Operator anwenden.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
AlexSTAL:

Das Array muss vom Typ Klassenzeiger sein, nicht von der Klasse selbst.

Dann können Sie den neuen Operator anwenden.

Darf ich Ihnen ein Beispiel nennen?

Es ist nur so, dass das Beispiel, das ich gegeben habe, aus der Dokumentation stammt und es nicht klar ist, wie es funktionieren soll...

 
Yedelkin:
Ich erkannte, dass das Problem ist, wie manrichtig füllen Array Shapes[10] mit Instanzen von Klassen abgeleitet von CShape. Die von mir vorgeschlagene Variante funktioniert aus irgendeinem Grund nicht. Lasst uns nachdenken.

Ob Sie denken oder nicht, 100 Rubel sind kein Geld.

Das Beispiel ist 100-prozentig fehlerhaft, und eine solche Implementierung ist entweder nicht gut durchdacht oder nicht fertig.

Ich werde die Ergebnisse meiner eigenen Code-Experimente nicht zitieren, sondern nur die Schlussfolgerungen nennen:

1. Wenn Sie Objekte nicht als Klassen, sondern als Strukturen deklarieren, passen sie problemlos in ein Array. Aber die Virialität muss entfernt werden, und Sie können nur mit der Funktionalität des Objekttyps arbeiten, den das Array hat (in diesem Fall eine Basisklasse);

2. 2) Sie können sie als Zeiger deklarieren und dann ein Array bilden:

a) Wenn Zeiger nicht gelöscht werden, entstehen Speicherlecks;

b) Sie können auch nicht normal mit der Nachfolgefunktion arbeiten.

PS

Um genau zu sein - Funktionalität, die in der Basisklasse deklariert wurde, ist verfügbar und auch in den Nachkommen sichtbar, aber alles, was in den Nachkommen erschienen ist, ist unzugänglich.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
AlexSTAL:

Ein Array muss vom Typ Zeiger auf Klassen sein, nicht vom Typ der Klasse selbst.

Dann können Sie den neuen Operator anwenden.

Ja, ich habe auch in diese Richtung gedacht, über die Verwendung von Zeigern. Aber dann sind die Bedingungen aus der Dokumentation nicht erfüllt:

"Für ein Quadrat (Klasse CSquare) wird die Fläche durch die Seiten berechnet, für einen Kreis (Klasse CCircle) wird die Fläche durch den Radius ausgedrückt und so weiter. Wir können ein Array zum Speichern von Objekten des Typs CShape erstellen , in dem wir sowohl das Objekt einer Basisklasse als auch alle seine Nachkommen speichern können. Später können wir die gleiche Funktion für jedes beliebige Element dieses Arrays aufrufen.

...Da wir die entsprechenden Werte der Mitglieder m_radius und m_square_side benötigen, um die Fläche eines Quadrats und eines Kreises zu berechnen, haben wir die Funktionen SetRadius und SetSide() in die Deklaration der entsprechenden Klasse aufgenommen. Jetzt können wir ein Array vom Typ Shape deklarieren und es mit Objekten abgeleiteter Klassen füllen ..."

 
AlexSTAL:

Ein Array muss vom Typ Zeiger auf Klassen sein, nicht vom Typ der Klasse selbst.

Dann können Sie den neuen Operator anwenden.

Normalerweise funktioniert das nicht. Obwohl es ein Array bilden wird.

Yedelkin:

...Da die Berechnung des Flächeninhalts eines Quadrats und eines Kreises entsprechende Werte für die Mitglieder m_radius und m_square_side erfordert, haben wir die Funktionen SetRadius und SetSide() in die Deklaration der entsprechenden Klasse aufgenommen. Jetzt können wir ein Array vom Typ Shape deklarieren und es mit Objekten abgeleiteter Klassen füllen..."

Wenn das Array vom Typ der Basisklasse ist, kann auf die nachgeordneten Funktionen nicht zugegriffen werden, d. h. SetRadius() und SetSide() sind nicht mehr verfügbar.

Deshalb sehe ich drei Möglichkeiten:

1. Die Anordnung sollte (wenn möglich) homogen sein;

2. Ich verstehe etwas von der OOP-Philosophie und der Architektur von MQL5 nicht;

3. entweder haben die Entwickler es versäumt, das Beispiel zu implementieren, oder sie haben die Frage nicht zu Ende gedacht.

 
Interesting:
Es wird nicht richtig funktionieren. Es wird jedoch ein Array gebildet.
Was meinen Sie damit, dass es nicht funktionieren wird?
 
Interesting:

Um genauer zu sein - die Funktionalität, die in der Basisklasse deklariert wurde, ist verfügbar, und gleichzeitig ist sie in den Nachkommen sichtbar, aber alles, was in den Nachkommen auftaucht, ist unzugänglich.

Ja, das ist genau das, worauf ich gestoßen bin.

Interessant:

Das Beispiel ist zu 100 Prozent fehlerhaft ...

Es hat sich herausgestellt, dass wir von den Autoren des Handbuchs eine Antwort zu diesem Thema benötigen.

 
Interesting:
Es wird nicht richtig funktionieren. Es wird jedoch ein Array gebildet.

Der Trick besteht darin, dass, wenn das Array vom Typ der Basisklasse ist, auf die nachgeordneten Funktionen nicht zugegriffen werden kann, d.h. SetRadius() und SetSide() sind nicht mehr verfügbar.

Deshalb sehe ich drei Möglichkeiten:

1. Die Anordnung sollte (wenn möglich) homogen sein;

2. Ich verstehe etwas von der OOP-Philosophie und der Architektur von MQL5 nicht;

3. die Entwickler haben entweder ein Beispiel verraten, das nicht funktioniert, oder sie haben die Aufgabe nicht erfüllt.

Ausführen:

class CBase
  {
public:
   void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   ((CTest *)Base).m_radius();
   delete Base;
  }

es könnte auf viel einfachere Weise geschehen... durch Virtualisierung:

class CBase
  {
public:
   virtual void m_radius() {Print("CBase");}
  };

class CTest : public CBase
  {
public:
   virtual void m_radius() {Print("CTest");}
  };

CBase* Base;

void OnStart()
  {
   Base = new CTest;
   Base.m_radius();
   delete Base;
  }
 
AlexSTAL:
Was meinen Sie damit, dass es nicht normal funktioniert?

1. Die Funktionalität der Nachkommenschaft ist nicht verfügbar. Ich weiß nicht, wer oder wie, aber ich persönlich habe nie Zugriff auf SetRadius() und SetSide() aus dem Array.Vielleicht gibt es einen Weg, um das Problem mit Autogenous zu lösen, aber ich möchte ohne sie zu tun.

2. Vielleicht arbeite ich falsch mit Zeigern, aber ich habe entweder immer ein Leck oder muss die Zeiger genau in dem Block treffen, in dem die Hauptarbeit geleistet wird.