是否有可能在MQL4中实现一个单子模式。 - 页 10

 
ALXIMIKS:

是的,谢谢你的关注,你是对的,在这个变体中它也不是一个单子。

关于隐式构造函数和运算符--把它们显式化并尝试使用它们,我想这是行不通的,因为你不能解除对一个对象的指针的引用。

在MQL4++中,所谓的 "指针 "似乎是隐含地被解除引用的。

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

该程序编译并成功运行。

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

看起来好像语言没有定义任何脱参,但是定义了一个从指针到引用的标准转换,在这个过程中会发生隐式脱参。assign()函数正是利用了这种特殊性。你不能不使用函数,因为看起来引用只能在函数参数中指定...

ALXIMIKS

为什么不工作,'ptr' - 不能调用受保护的成员函数

class smart_ptr{
            Singleton* ptr;
      public:        
            smart_ptr(Singleton* val): ptr(val){}          
            smart_ptr(): ptr(NULL){} 
            ~smart_ptr(){delete ptr;}
      };
如果这是个问题,显然是因为你把Singleton类的析 构器放在了保护的部分。