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() 함수가 이용하는 것이 바로 이 기능입니다. 참조는 함수 매개변수에서만 설정할 수 있기 때문에 함수 없이는 할 수 없습니다...

알시믹스 :

작동하지 않는 이유, 'ptr' - 보호된 멤버 함수를 호출할 수 없습니다. :

 class smart_ptr{
            Singleton* ptr;
       public :        
            smart_ptr(Singleton* val): ptr(val){}          
            smart_ptr(): ptr( NULL ){} 
            ~smart_ptr(){ delete ptr;}
      };
이것이 질문이라면 분명히 Singleton 클래스의 소멸자가 보호 섹션에 있기 때문입니다.