MQL5'te OOP hakkında sorular - sayfa 67

 

böyle başka bir soru, işte Wiki makalesi Soyut sınıf

C++ örneğiyle ilgileniyor

 class CA { // Абстрактный класс
   public :
    CA ( void ) { std::cout << "This object of the class " ; }

     virtual void Abstr ( void ) = 0 ; // Чистая (пустая) виртуальная функция.
     void          fun   ( void ) { std::cout << "Реализация не будет наследоваться!" ; }

    ~CA () { std::cout << "." << std::endl; } //Вызывается в обр. порядке конструкторов
  };

class CB : public CA {
   public :
    CB ( void ) { std::cout << "CB;" ; }

     void Abstr ( void ){ std::cout << " call function cb.Abstr();" ; } //Подменяющая функция.
     void fun   ( void ){ std::cout << " call function cb.fun()" ; }

    ~CB () {} // Неверно для абстр. кл. ~CB(){ ~CA(); } 
  };

class CC : public CA {
   public :
    CC ( void ) { std::cout << "CC;" ; }

     void Abstr ( void ) { std::cout << " call function cc.Abstr();" ; } //Подменяющая функция.
     void fun   ( void ) { std::cout << " call function cc.fun()" ; }

  ~CC () {} // Неверно для абстр. кл. ~CC(){ ~CA(); } 
  };

int main () {
  std::cout << "Program:" << std::endl;
  CB cb;
  cb.Abstr(); cb.fun(); cb.~CB();

  CC cc;
  cc.Abstr(); cc.fun(); cc.~CC();

   return 0 ;
  }

Programın sonucu:

Program:

CB sınıfının bu nesnesi; çağrı fonksiyonu cb.abstr(); cb.fun() işlevini çağırın.

CC sınıfının bu nesnesi; çağrı işlevi cc.abstr(); cc.fun() işlevini çağırın.

.

.


void fun ( void ) yöntemiyle ilgileniyor :

- neden sanal belirteç yok?

- sanal eklerseniz, gelecekte ne değişecek?


neden ve ne için, işte kod:

 class base
{
public :
   virtual void HighPriorityTask() {}
   virtual void Task() {}
};
//+------------------------------------------------------------------+
class A: public base
{
public :
   virtual void HighPriorityTask() { Print ( __FUNCSIG__ ); }
};
//+------------------------------------------------------------------+
class B: public base
{
public :
   virtual void Task() { Print ( __FUNCSIG__ ); }
};

//+------------------------------------------------------------------+
void OnStart ()
{
   base *obj[ 4 ];;
   obj[ 0 ] = new A; obj[ 1 ] = new A;  
   obj[ 2 ] = new B; obj[ 3 ] = new B; 
   for ( int i= ArraySize (obj)- 1 ; i>= 0 ; i--)
   {
      obj[i].HighPriorityTask();
      obj[i].Task();
   }
   
   for ( int i= ArraySize (obj)- 1 ; i>= 0 ; i--)
       delete obj[i];

2020.05.28 14:41:20.294 tst (EURUSD,H1) geçersiz B::Görev()

2020.05.28 14:41:20.298 tst (EURUSD,H1) geçersiz B::Görev()

2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()

2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()

istediğim gibi çalışıyor - bir temel sınıf var ve ondan miras alıyorum, ancak mirasçılarda yalnızca bir yönteme ihtiyaç duyulacak ve bildirim ve başlatma sırasına bakılmaksızın önce HighPriorityTask'a sahip nesneleri çağırmak istiyorum ( ) yöntemi ve ardından Görev ()


ve tabii ki hepsi bir döngüde

basit yollarla mümkün mü?

 
Igor Makanu :

ve tabii ki hepsi bir döngüde

basit yollarla mümkün mü?

Ve bunun neden bir döngüde yapılması gerekiyor?

Ve neden aynı zamanda doğal?

Doğal olarak, en az iki döngü olacaktır.

 
Koldun Zloy :

Ve bunun neden bir döngüde yapılması gerekiyor?

Ve neden aynı zamanda doğal?

Doğal olarak, en az iki döngü olacaktır.

Tamam, 2 döngü, yani 2 döngü, yani mucize olmayacak ((

 
Igor Makanu :

Tamam, 2 döngü, yani 2 döngü, yani mucize olmayacak ((

Döngülerden tamamen kurtulmayı deneyebilirsiniz.
Döngü ve özyineleme olmadan 1'den 100'e nasıl yazdırılacağına dair örnekler vardır.
Belki bu örnekler yardımcı olabilir, tabii ki bu genellikle sorunun konusuysa))

Печать от 1 до 100 на C ++, без цикла и рекурсии | Портал информатики для гиков
  • 2020.01.01
  • espressocode.top
Ниже приводится программа на C ++, которая печатает от 1 до 100 без цикла и без рекурсии. #include using namespace std;    template
 
Roman :
bu saçmalık neden burada?
 
Igor Makanu :

böyle başka bir soru, işte Wiki makalesi Soyut sınıf

C++ örneğiyle ilgileniyor

Programın sonucu:

Program:

CB sınıfının bu nesnesi; çağrı fonksiyonu cb.abstr(); cb.fun() işlevini çağırın.

CC sınıfının bu nesnesi; çağrı işlevi cc.abstr(); cc.fun() işlevini çağırın.

.

.


void fun ( void ) yöntemiyle ilgileniyor :

- neden sanal belirteç yok?

- sanal eklerseniz, gelecekte ne değişecek?


neden ve ne için, işte kod:

2020.05.28 14:41:20.294 tst (EURUSD,H1) geçersiz B::Görev()

2020.05.28 14:41:20.298 tst (EURUSD,H1) geçersiz B::Görev()

2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()

2020.05.28 14:41:20.298 tst (EURUSD,H1) void A::HighPriorityTask()

istediğim gibi çalışıyor - bir temel sınıf var ve ondan miras alıyorum, ancak mirasçılarda yalnızca bir yönteme ihtiyaç duyulacak ve bildirim ve başlatma sırasına bakılmaksızın önce HighPriorityTask'a sahip nesneleri çağırmak istiyorum ( ) yöntemi ve ardından Görev ()


ve tabii ki hepsi bir döngüde

basit yollarla mümkün mü?

1. Bir temel sınıf işaretçisi bildirir ve bir alt nesne oluşturursanız, bu aynı temel sınıf işaretçisi aracılığıyla yöntemleri çağırırken:

a) sanal yöntemler bir alt sınıf tarafından çağrılır (bunun için özel olarak oluşturulmuş bir sanal işlevler tablosu aracılığıyla)

b) sanal olmayan yöntemler temel sınıf tarafından çağrılır. Alt sınıfta geçersiz kılınmış olsalar bile.

2. Bir döngüde hemen istiyorsanız, o zaman

a) bir dizi nesneyi türe göre sıralama zahmetine girmeyin.

b) belirli görevler için - bu görevleri gerçekleştiren nesnelere ayrı bir dizi işaretçi tutun. Onlar. HighPriorityTask'ı çağırması gereken tüm nesneler

first adlı ayrı bir dizide saklanmalıdır

ps ancak teorik olarak sıralama yapmadan nasıl hayal edebilirsiniz - döngünün bir geçişinde, nesnelerin önce hangi yarısına sahip olur ve sonra geri kalanı yürütülür? gülümseme Eh, sadece çit için görev sıraları varsa.

Ama bu zaten yaratıcı bir soru - bir kuruş problemini çözmek için birçok karmaşık yol bulabilirsin)) asıl mesele fizik yasalarına tecavüz etmemek ve her şey yoluna girecek)))

 
Aleksey Mavrin :

2. Bir döngüde hemen istiyorsanız, o zaman

a) bir dizi nesneyi türe göre sıralama zahmetine girmeyin.

b) belirli görevler için - bu görevleri gerçekleştiren nesnelere ayrı bir dizi işaretçi tutun. Onlar. HighPriorityTask'ı çağırması gereken tüm nesneler

first adlı ayrı bir dizide saklanmalıdır

ps ama teorik olarak sıralama yapmadan nasıl hayal edebilirsiniz - döngünün bir geçişinde, önce nesnelerin hangi yarısına sahip olacak ve sonra geri kalanı yürütülecek? gülümse Eh, sadece çit için görev sıraları varsa.

Ama bu zaten yaratıcı bir soru - bir kuruş problemini çözmek için birçok karmaşık yol bulabilirsin)) asıl mesele fizik yasalarına tecavüz etmemek ve her şey yoluna girecek)))

Kesinlikle istemiyorum, bence derleyici boş yöntemleri optimize ediyor

Alexey Mavrin :

1. Bir temel sınıf işaretçisi bildirir ve bir alt nesne oluşturursanız, bu aynı temel sınıf işaretçisi aracılığıyla yöntemleri çağırırken:

a) sanal yöntemler bir alt sınıf tarafından çağrılır (bunun için özel olarak oluşturulmuş bir sanal işlevler tablosu aracılığıyla)

b) sanal olmayan yöntemler temel sınıf tarafından çağrılır. Alt sınıfta geçersiz kılınmış olsalar bile.

evet, nedense json kitaplığına hükmettiğimi hatırlamıyordum https://www.mql5.com/en/code/11134 (github'da bir yerde KB'den biraz daha taze buldum)

derleyici uyarıları vardı

kullanımdan kaldırılan davranış, gizli yöntem çağrısı gelecekteki bir MQL derleyici sürümünde devre dışı bırakılacak

sınıfta bir yöntem belirterek tedavi

 this .JSONValue:: getLong(getValue(index),out);

teşekkür ederim, genel olarak net resim

 
Igor Makanu :

Kesinlikle istemiyorum, bence derleyici boş yöntemleri optimize ediyor

sanal? bir gerçek değildir. ancak boş bir işlevi çağırmak zaten pek bir şey yemez.

Igor Makanu :

Tamam, 2 döngü, sonra 2 döngü, o zaman mucize olmayacak ((

Mantıksal olarak iki döngüde yapılan şeyi neden bir döngüde itelim? sonuçta, hız veya netlik veya basitlik açısından bir kazanç yoktur ve sabit sürücülerin boyutları uzun süre megabayt cinsinden ölçülmez.

 
Andrei Trukhanovich :

Mantıksal olarak iki döngüde yapılan şeyi neden bir döngüde itelim? sonuçta, hız veya netlik veya basitlik açısından bir kazanç yoktur ve sabit sürücülerin boyutları uzun süre megabayt cinsinden ölçülmez.

Ve henüz hiçbir şeyi çarpmadım! ))))

normal yöntem çağrılarına benzer bir şey yapmanın özelliklerini öğrenene kadar

teşekkürler güzel anlatılmış

Andrey Trukhanoviç :

sanal? bir gerçek değildir.

Örneğin, soru ya geniş birpolimorfizm aracı seçiminden ortaya çıkar, sonra onsuz sanal olur, sonra miras alırız, sonra bu yöntemi türetilmiş sınıflarda kapatırız

 
Roman :

Döngülerden tamamen kurtulmayı deneyebilirsiniz.
Burada 1'den 100'e döngü ve özyineleme olmadan nasıl yazdırılacağına dair örnekler var.
Belki bu örnekler yardımcı olabilir, tabii ki bu genellikle sorunun konusuysa))

Ve ne? Başka bir yama. Bu, kalıpların taraftarlarının onu tanımadığı bir şey, görünüşe göre Ortodoks değil, kanonik değil. Neden özyineleme değil? Ayrıca bir özyineleme, yalnızca birlikte değil, çapraz.