É possível implementar um padrão de um único botão na MQL4. - página 10

 
ALXIMIKS:

Sim, obrigado por sua atenção, você está certo, também não é um único botão nesta variante.

Sobre os construtores e operadores implícitos - explicite-os e tente usá-los, acho que não vai funcionar, já que você não pode desreferenciar um ponteiro para um objeto

Na MQL4++ os chamados "indicadores" parecem ser desreferenciados 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);
}

O programa é compilado e executado com sucesso:

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

Parece que a linguagem NÃO tem nenhum desreferenciamento definido, mas uma conversão padrão de ponteiro para referência é definida, durante a qual o desreferenciamento implícito ocorre. É esta peculiaridade que a função assign() explora. Não se pode passar sem uma função, pois parece que as referências só podem ser especificadas nos parâmetros da função...

ALXIMIKS:

Por que não funciona, 'ptr' - não pode chamar a função de membro protegido :

class smart_ptr{
            Singleton* ptr;
      public:        
            smart_ptr(Singleton* val): ptr(val){}          
            smart_ptr(): ptr(NULL){} 
            ~smart_ptr(){delete ptr;}
      };
Se isto é um problema, é obviamente porque você tem o destruidor da classe Singleton na seção protegida.
Razão: