OOP. Başvuru soruları - sayfa 13

 
TheXpert :
Bir örnekle göster ki tutarsızlık olmasın, sonra cevaplayayım.

 //1-ый вариант. Переменная-член strA инициализируется автоматически
class A
  {
public :
   string             strA;
                     A( void ) { Print ( "strA=" ,strA); };
                    ~A( void ){};
  };
//2-ой вариант. Переменная-член strB инициализируется при помощи инициализатора пользовательским значением
class B
  {
public :
   string             strB;
                     B( const string str) : strB(str) { Print ( "strB=" ,strB); }
                    ~B( void ){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   A a1;
   B b1( "Пользовательское значение" );
  }

Örnek basit. a1.strA üyesinin otomatik başlatılması için 15 "bilgisayar döngüsü" harcandığını varsayalım. b1.strB üyesinin başlatılması için de 15 döngü harcandığına dair bir ön sonuca vardım. Bu doğru?

 

Standart kitaplığın CExpert sınıfında bu tür korumalı bildirimler vardır.

 //--- trading objects
CExpertTrade     *m_trade;     // trading object
CExpertSignal    *m_signal;   // trading signals object
CExpertMoney     *m_money;     // money manager object
CExpertTrailing  *m_trailing; // trailing stops object

Aynı zamanda, bu nesnenin yapıcısı aşağıdaki satırları içerir.

m_trade    = NULL ;
m_signal   = NULL ;
m_money    = NULL ;
m_trailing = NULL ;

Sınıfımda benzer bir şey düzenlemeye çalıştım, ancak daha fazla başlatma yapmadan (Init ve InitXXX örneğini izleyerek) .

Derleyici her şeyi uyarılar ve hatalar olmadan derledi, ancak EA çizelgeye kurulduğunda, kritik bir 281 hatası (Geçersiz işaretçi erişimi ) geldi ve EA grafikten kaldırıldı.

Bu bağlamda şu sorular ortaya çıktı:

1. Yapıcıda yapılacak doğru şey nedir (NULL belirterek veya belirli bir nesneye hemen bir işaretçi yazarak)?

2. InitTrade türündeki işaretçilerin sonradan zorunlu olarak başlatılmasına ihtiyacınız var mı?

 
Interesting :

Standart kitaplığın CExpert sınıfında bu tür korumalı bildirimler vardır.

Aynı zamanda, bu nesnenin yapıcısı aşağıdaki satırları içerir.

Sınıfımda benzer bir şey düzenlemeye çalıştım, ancak daha fazla başlatma yapmadan (Init ve InitXXX örneğini izleyerek) .

Derleyici her şeyi uyarılar ve hatalar olmadan derledi, ancak EA çizelgeye kurulduğunda, kritik bir 281 hatası (Geçersiz işaretçi erişimi ) geldi ve EA grafikten kaldırıldı.

Bu bağlamda şu sorular ortaya çıktı:

1. Yapıcıda yapılacak doğru şey nedir (NULL belirterek veya belirli bir nesneye hemen bir işaretçi yazarak)?

2. InitTrade türündeki işaretçilerin sonradan zorunlu olarak başlatılmasına ihtiyacınız var mı?

1. Doğru ve falan. Her şey sınıfın özel uygulamasına bağlıdır (özellikle CExpert değil). Ancak, InitXXX yönteminde bool döndüren dinamik nesneler oluşturmak daha iyidir (çünkü yapıcı yürütme sonucunu döndürmez ve sonraki analiziyle başlatma bayrağını ayarlamanız/sıfırlamanız gerekir).

2. Elbette ihtiyacınız var. Aksi takdirde kritik hata 281 (Geçersiz işaretçi erişimi ).

not. Bu arada, teşekkürler. Kullanmadan önce işaretçi kontrolleri eklemem gerekecek.

 
Yedelkin :

Örnek basit. a1.strA üyesinin otomatik başlatılması için 15 "bilgisayar döngüsü" harcandığını varsayalım. b1.strB üyesinin başlatılması için de 15 döngü harcandığına dair bir ön sonuca vardım. Bu doğru?

Hayır, bu kesinlikle beatlerle ilgili değil. Eh, ya da tam olarak döngülerde değil.
 
TheXpert :
Hayır, bu kesinlikle beatlerle ilgili değil. Eh, ya da tam olarak döngülerde değil.

Tamam, o halde çok basit bir soru: Yukarıdaki örnekte a1.strA üyesi mi yoksa b1.strB üyesi mi daha hızlı başlatılır?

Ya da "noktasal" ne okumalı? Fiziksel olarak, programlamayı "makine-işlemci" düzeyinde incelemenin bir yolu yoktur.

 
Yedelkin :

Tamam, o halde çok basit bir soru: Yukarıdaki örnekte a1.strA üyesi mi yoksa b1.strB üyesi mi daha hızlı başlatılır?

Ya da "noktasal" ne okumalı? Fiziksel olarak, programlamayı "makine-işlemci" düzeyinde incelemenin bir yolu yoktur.

a1.strA, başlatma işlemi yerinde basit sıfırlamadan oluştuğu için daha hızlı başlatılacaktır. b1.strB'ye bellek ayrılacaktır.

Ancak bu farkın ölçülmesi oldukça zordur, çünkü başlatma etrafındaki kod dikkate alındığında yüzde birden çok daha azdır.

 
Yedelkin :

başlatmak için daha hızlı olan

soru yanlış.
 
stringo :

b1.strB'ye bellek ayrılacaktır.

İşte, teşekkürler - mantığımdaki eksik halka.

TheXpert , yardımın için teşekkürler. Konunun özünü kendi cümlelerimle açıklamaya çalıştım. Gerçekten doğru bir sorunun konunun içinde olanlar tarafından sorulduğunu kabul ediyorum. Ama genelde benim seviyemde sorular sormuyorlar :)

 
uncleVic :

1. Doğru ve falan. Her şey sınıfın özel uygulamasına bağlıdır (özellikle CExpert değil). Ancak, InitXXX yönteminde bool döndüren dinamik nesneler oluşturmak daha iyidir (çünkü yapıcı yürütme sonucunu döndürmez ve sonraki analiziyle başlatma bayrağını ayarlamanız/sıfırlamanız gerekir).

2. Elbette ihtiyacınız var. Aksi takdirde kritik hata 281 (Geçersiz işaretçi erişimi ).

not. Bu arada, teşekkürler. Kullanmadan önce işaretçi kontrolleri eklemem gerekecek.

Teşekkürler, şimdi her şey yerli yerinde. Ancak, ek bir soru daha var - Diyelim ki 281 hatası oluşursa, ancak danışmanın boşaltılmaması istenir. O zaman nasıl olunur?

Soruyu açıklığa kavuşturmama izin verin - Tüm başlatma adımları tamamlandıktan sonra 281. hata meydana gelirse, ancak bu, Uzman Danışmanın ana çalışmasını hiç başlatılmayacak kadar kritik bir şekilde etkilemiyorsa?

 
Interesting :

Diyelim ki 281 hatası oluşursa, ancak danışmanın boşaltılmaması istenir. O zaman nasıl olunur?

Soruyu açıklığa kavuşturmama izin verin - Tüm başlatma adımları tamamlandıktan sonra 281. hata meydana gelirse, ancak bu, Uzman Danışmanın ana çalışmasını hiç başlatılmayacak kadar kritik bir şekilde etkilemiyorsa?

" Geçersiz işaretçi erişimi " == " Geçersiz bir işaretçiye erişim girişiminde bulunuldu"? Evet ise, o zaman

Geçersiz bir işaretçiye erişme girişimi , programın kritik bir şekilde sonlandırılmasına yol açar. Bu nedenle, işaretçiyi kullanmadan önce CheckPointer() işlevini kullanmaya ihtiyaç vardır. İşaretçi aşağıdaki durumlarda geçersiz olabilir:

  • işaretçi NULL ;
  • nesne silme operatörü kullanılarak yok edildiyse.
Neden: