È possibile implementare un modello singleton in MQL4. - pagina 10

 
ALXIMIKS:

Sì, grazie per l'attenzione, hai ragione, non è un singoletto neanche in questa variante.

Riguardo ai costruttori e agli operatori impliciti - renderli espliciti e provare a usarli, penso che non funzionerà, dato che non si può dereferenziare un puntatore a un oggetto

In MQL4++ i cosiddetti "puntatori" sembrano essere dereferenziati implicitamente:

#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);
}

Il programma viene compilato ed eseguito con successo:

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

Sembra che il linguaggio NON abbia alcuna dereferenziazione definita, ma che sia definita una conversione standard da puntatore a riferimento, durante la quale avviene la dereferenziazione implicita. È questa peculiarità che la funzione assign() sfrutta. Non si può fare a meno di una funzione, perché sembra che i riferimenti possano essere specificati solo nei parametri della funzione...

ALXIMIKS:

Perché non funziona, 'ptr' - non può chiamare la funzione membro protetta :

class smart_ptr{
            Singleton* ptr;
      public:        
            smart_ptr(Singleton* val): ptr(val){}          
            smart_ptr(): ptr(NULL){} 
            ~smart_ptr(){delete ptr;}
      };
Se questo è un problema, è ovviamente perché avete il distruttore della classe Singleton nella sezione protetta.
Motivazione: