Singleton modelini MQL4'te uygulamak mümkün mü? - sayfa 10

 
ALXIMIKS :

evet, ilginiz için teşekkürler, haklısınız, bu versiyonda da singleton değil.

Örtük yapıcılar ve operatörler ile ilgili olarak - onları açık hale getirin ve kullanmaya çalışın, bana öyle geliyor ki, bir nesneye işaretçiyi yeniden adlandırmak imkansız olduğu için işe yaramayacak gibi görünüyor.

MQL4++'da, sözde "işaretçiler" dolaylı olarak başvurudan kaldırılmış gibi görünüyor:

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

Program başarıyla derlenir ve çalışır:

 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

Başvuru kaldırmanın dilde tanımlı DEĞİLDİR, ancak bir işaretçiden referansa standart bir dönüşüm tanımlanır ve bu sırada örtük başvuru kaldırma gerçekleşir. assign() işlevinin kullandığı bu özelliktir. Bir fonksiyon olmadan yapamazsınız, çünkü görünüşe göre referanslar sadece fonksiyon parametrelerinde ayarlanabilir...

ALXIMIKS :

Neden çalışmıyor, 'ptr' - korumalı üye işlevi çağrılamıyor :

 class smart_ptr{
            Singleton* ptr;
       public :        
            smart_ptr(Singleton* val): ptr(val){}          
            smart_ptr(): ptr( NULL ){} 
            ~smart_ptr(){ delete ptr;}
      };
Bu bir soruysa, o zaman, açıkçası, çünkü Singleton sınıfının yıkıcısı korumalı bölümünüzde.