OOP, Vorlagen und Makros in mql5, Feinheiten und Anwendungen - Seite 26

 

Es hat sich eine Frage ergeben:

Es gibt eine Klasse "Programm", die die Klassen"Neuer Balken" und "Datenmanager" verwendet. Die Klasse "Neuer Balken" verwendet ihrerseits ebenfalls die Klasse "Datenmanager". Öffentliche Getter und Setter sind in der Klasse "Data Manager" implementiert.

class CDataManager
   {
private:
    string          m_symbol;
    ENUM_TIMEFRAMES m_timeframe;
public:
    //--- Геттеры и сеттеры
   };
class CNewBar
   {
private:
    CDataManager  m_data;
   };
class СProgram
   {
private:
    CNewBar        m_newBar;
    CDataManager   m_data;
   };

Frage: Welche Möglichkeiten gibt es bei der Initialisierung des Programms für die Klasse "Neuer Balken", um die Eigenschaften "Symbol" und "Zeitrahmen" der Klasse "Datenmanager" festzulegen? Ich möchte keine öffentlichen Getter und Setter in der Klasse New Bar haben, um auf die Datenmanagerfelder zuzugreifen. Und wir möchten, dass der Datenmanager privat bleibt.

Mit anderen Worten: Die Anwendung kann mehrere Klassen verwenden, die den Datenmanager nutzen. Während der Initialisierung des Programms müssen alle Managerfelder aller Klassen mit den erforderlichen Werten initialisiert werden. Ich möchte aber nicht in allen Klassen Getter erstellen, um auf die Felder des Datenmanagers zuzugreifen. Also...

 
Alexey Kozitsyn:
Nach Ihrer Beschreibung ist es sinnvoll, diese Einstellungen in einer separaten Einheit zusammenzufassen, die für alle Manager und darüber hinaus gleich ist
 
TheXpert:
Nach Ihrer Beschreibung ist es sinnvoll, diese Einstellungen in einer separaten Einheit vorzunehmen, die für alle Manager gleich ist und nicht nur für

Ja, es sieht so aus, dass Sie Klassen, die einen Manager benötigen, von einer Basisklasse erben müssen, die Getter für die Managerfelder hat. Ich danke Ihnen.

 
Alexey Kozitsyn:

Es hat sich eine Frage ergeben:

Es gibt eine Klasse "Programm", die die Klassen"Neuer Balken" und "Datenmanager" verwendet. Die Klasse "Neuer Balken" verwendet ihrerseits die Klasse "Datenmanager". Öffentliche Getter und Setter sind in der Klasse "Data Manager" implementiert.

Frage: Welche Möglichkeiten gibt es bei der Initialisierung des Programms für die Klasse "Neuer Balken", um die Eigenschaften "Symbol" und "Zeitrahmen" der Klasse "Datenmanager" festzulegen? Ich möchte keine öffentlichen Getter und Setter in der Klasse New Bar haben, um auf die Datenmanagerfelder zuzugreifen. Und wir möchten, dass der Datenmanager privat bleibt.

Mit anderen Worten: Die Anwendung kann mehrere Klassen verwenden, die den Datenmanager nutzen. Während der Initialisierung des Programms müssen alle Managerfelder aller Klassen mit den erforderlichen Werten initialisiert werden. Ich möchte aber nicht in allen Klassen Getter erstellen, um auf die Felder des Datenmanagers zuzugreifen. Also...

class CDataManager
   {
private:
    string          m_symbol;
    ENUM_TIMEFRAMES m_timeframe;
public:
    CDataManager():m_symbol(_Symbol),m_timeframe(_Period){}
    CDataManager(string symbol,ENUM_TIMEFRAMES frame):m_symbol(symbol),m_timeframe(frame){}
    //--- Геттеры и сеттеры
   };
class CNewBar
   {
private:
    CDataManager*  m_data;
    bool           cIsDelData;
public:
   CNewBar(CDataManager* data=NULL):m_data(!data?new CDataManager:data),cIsDelData(!data){}
   CNewBar(string symbol,ENUM_TIMEFRAMES frame):m_data(new CDataManager(symbol,frame)),cIsDelData(true){}
  ~CNewBar() {if (cIsDelData) delete m_data;}
   };
class CProgram
   {
private:
    CNewBar        m_newBar;
    CDataManager   m_data;
public:
    CProgram():m_newBar(&m_data){}
   };

So mache ich das auch.

 
Vladimir Simakov:

So mache ich es ungefähr.

Danke für das Beispiel, es ist ein bisschen kompliziert, aber im Großen und Ganzen ist die Idee klar. Sofort stellt sich die Frage: Ok, wenn "eine Verschachtelungsebene" - hier ist es klar, aber wenn es mehrere Verschachtelungsebenen geben wird?

Hinzugefügt:

Es ist auch nicht klar, warum das Feld cIsDelData? Schließlich können Sie m_data im Destruktor einfach gegen POINTER_DINAMIC prüfen. Oder liege ich da falsch?

 

Wenn Sie Vererbung betreiben, erhalten Sie eine Menge unnötiger Methoden. Und das Objekt muss privat sein. Also, Sie werden es nicht glauben, aber der einfachste Weg ist, Setter für alle Klassen, die Datenmanager verwenden.

Wenn alle Datenmanager mit den gleichen Parametern arbeiten, ist es besser, keine Objekte zu erstellen, sondern einen Zeiger auf einen Datenmanager zu übergeben. In diesem Fall ist nur ein Setter erforderlich, um den Zeiger zu übergeben.

 
Alexey Kozitsyn:

Danke für das Beispiel, es ist ein bisschen kompliziert, aber im Großen und Ganzen ist die Idee klar. Sofort stellt sich die Frage: Ok, wenn "eine Verschachtelungsebene" - hier ist es klar, aber wenn es mehrere Verschachtelungsebenen geben wird?

Hinzugefügt:

Es ist auch nicht klar, warum das Feld cIsDelData? Schließlich können Sie m_data im Destruktor einfach gegen POINTER_DINAMIC prüfen. Oder liege ich da falsch?

Nein, Sie irren sich. Sie können einen Zeiger auf ein dynamisches Objekt übergeben und, oops, es sicher beenden.
Und über das Nisten. Sie erstellen eine Instanz eines Objekts, wo Sie zunächst brauchen, und nur die Zeiger weiter, wie in dem Beispiel oben. Wenn es im Allgemeinen beabsichtigt ist, ein Singleton im Projekt zu sein, können Sie ein Singleton machen, aber ich habe nie eines mit mql gemacht, also habe ich es nicht gebraucht, ich muss es versuchen.
 
Dmitry Fedoseev:
Wladimir Simakow:

Danke, ich werde darüber nachdenken.

 
Vladimir Simakov:

Ich mache es ungefähr so.

was diese ZeileCDataManager* m_data bedeutet;

Leute, ich möchte so etwas machen. Ich habe ein Makro.

#define  foor(a,b,v) \
for(;Funkziya(a,b,v);b++)
//я хочу доработать макрос чтобы получилось так
#define  foor1(a,b,v,g) \
//за основу будет взят первый макрос
for(;Funkziya(a,b,v)&&g;b++)//эффект должен быть такой где g это дополнительное выражение которое будет дописываться в новый макрос

Infolgedessen werde ich 2 Makrosfoor undfoor1 haben.

 
Seric29:

was diese ZeileCDataManager* m_data bedeutet;

Leute, ich möchte so etwas machen. Ich habe ein Makro.

Infolgedessen werde ich 2 Makrosfoor undfoor1 haben.

Ein Zeiger auf ein Objekt.

Nichts für ungut, aber es ist noch zu früh für Sie, sich mit solchen Makros zu befassen. Zunächst einmal sollten Sie verstehen, warum ich das getan habe:

#define  foor1(a,b,v,g) \
for(;Funkziya(a,b,v)&&(g);(b)++)