Ist es möglich, ein Singleton-Muster in MQL4 zu implementieren. - Seite 10

 
ALXIMIKS:

Ja, danke für Ihre Aufmerksamkeit, Sie haben Recht, es ist auch in dieser Variante kein Singleton.

Über implizite Konstruktoren und Operatoren - machen Sie sie explizit und versuchen Sie, sie zu verwenden, ich denke, es wird nicht funktionieren, da man einen Zeiger auf ein Objekt nicht derefenzieren kann

In MQL4++ scheinen so genannte "Pointer" implizit dereferenziert zu werden:

#property strict

/******************************************************************************/
class A {
public:
  /******************************************************************************/
  A() {
    Print("class A: Конструктор по умолчанию");
  }

  /******************************************************************************/
  A(const A &a) {
    Print("class A: Конструктор копии");
  }

  /******************************************************************************/
  void operator =(const A &a) {
    Print("class A: Оператор присваивания");
  }
};

/******************************************************************************/
void assign(A &l, A &r) {
  Print("Функция assign()");
  l = r;
}

/******************************************************************************/
void OnStart() {
  Print("OnStart(): Создаём по умолчанию");
  A a;

  Print("OnStart(): Получаем \"адрес\" первого объекта");
  A *p = GetPointer(a);

  Print("OnStart(): Создаём копию, прямо инициализируя предыдущим объектом");
  A b(a);

  Print("OnStart(): Выполняем присваивание, используя предыдущий объект");
  b = a;

  Print("OnStart(): Создаём копию, прямо инициализируя так называемым \"указателем\" на предыдущий объект");
  A c(p);

  Print("OnStart(): Выполняем присваивание, используя так называемый \"указатель\" на предыдущий объект");
  b = p;

  Print("OnStart(): Выполняем присваивание так называемому \"указателю\" значения его же самого");
  p = p;

  // *p = *p; Ошибка: '*' - unexpected token, то есть, присвоить объекту другой объект, если есть "адреса" обоих объектов, не так-то просто...

  Print("OnStart(): Выполняем присваивание объекту по \"адресу\" значения его же самого с помощью вспомогательной функции");
  assign(p, p);
}

Das Programm wird kompiliert und erfolgreich ausgeführt:

22:23:46 Script 3 EURUSDm,H1: loaded successfully
22:23:46 3 EURUSDm,H1: initialized
22:23:46 3 EURUSDm,H1: OnStart(): Создаём по умолчанию
22:23:46 3 EURUSDm,H1: class A: Конструктор по умолчанию
22:23:46 3 EURUSDm,H1: OnStart(): Получаем "адрес" первого объекта
22:23:46 3 EURUSDm,H1: OnStart(): Создаём копию, прямо инициализируя предыдущим объектом
22:23:46 3 EURUSDm,H1: class A: Конструктор копии
22:23:46 3 EURUSDm,H1: OnStart(): Выполняем присваивание, используя предыдущий объект
22:23:46 3 EURUSDm,H1: class A: Оператор присваивания
22:23:46 3 EURUSDm,H1: OnStart(): Создаём копию, прямо инициализируя так называемым "указателем" на предыдущий объект
22:23:46 3 EURUSDm,H1: class A: Конструктор копии
22:23:46 3 EURUSDm,H1: OnStart(): Выполняем присваивание, используя так называемый "указатель" на предыдущий объект
22:23:46 3 EURUSDm,H1: class A: Оператор присваивания
22:23:46 3 EURUSDm,H1: OnStart(): Выполняем присваивание так называемому "указателю" значения его же самого
22:23:46 3 EURUSDm,H1: OnStart(): Выполняем присваивание объекту по "адресу" значения его же самого с помощью вспомогательной функции
22:23:46 3 EURUSDm,H1: Функция assign()
22:23:46 3 EURUSDm,H1: class A: Оператор присваивания
22:23:46 3 EURUSDm,H1: uninit reason 0
22:23:46 Script 3 EURUSDm,H1: removed

Es sieht so aus, als ob die Sprache KEINE Dereferenzierung definiert hat, sondern eine Standardkonvertierung von Zeiger zu Referenz definiert ist, bei der eine implizite Dereferenzierung stattfindet. Diese Besonderheit wird von der Funktion assign() ausgenutzt. Ohne eine Funktion geht es nicht, denn es sieht so aus, als ob Referenzen nur in Funktionsparametern angegeben werden können...

ALXIMIKS:

Warum funktioniert es nicht, 'ptr' - kann keine geschützte Mitgliedsfunktion aufrufen :

class smart_ptr{
            Singleton* ptr;
      public:        
            smart_ptr(Singleton* val): ptr(val){}          
            smart_ptr(): ptr(NULL){} 
            ~smart_ptr(){delete ptr;}
      };
Wenn dies ein Problem ist, liegt es offensichtlich daran, dass Sie den Destruktor der Singleton-Klasse im geschützten Abschnitt haben.