OOP (Nesneye Yönelik Programlama) hakkında sorular - sayfa 9

 
Integer :

Bu, yeni operatörle bir örnek oluşturmanın gerekli olacağı anlamına gelir.
Yani bir şeyi anlamıyorum. Yeni operatörün kullanımını zorlamak için iyi nedenler nelerdir? O olmadan olmaz mı?
 
hoz :
Yani bir şeyi anlamıyorum. Yeni operatörün kullanımını zorlamak için iyi nedenler nelerdir? O olmadan olmaz mı?


Nesnelerin dinamik olarak oluşturulması gerekiyorsa gereklidir. Kaç tane nesneye ve ne tür nesnelere ihtiyaç duyulacağı önceden bilinmiyorsa.

 
hoz :
Так я вот одного не пойму. Какие веские причины принуждают к использованию оператора new ? Без него типа никак?
tamsayı :
Nesnelerin dinamik olarak oluşturulması gerekiyorsa gereklidir. Kaç tane nesneye ve ne tür nesnelere ihtiyaç duyulacağı önceden bilinmiyorsa.

Dinamik sınıf dizilerini kullanabilirsiniz. MQL'de bu işe yarayacaktır. C++'da, sınıf üyelerinin sınıf başlatmasıyla ilgili sorunlar olabilir. Bu nedenle, bir diziye bir işaretçi koymak daha iyidir, ancak basit olanı değil, akıllı olanı. Sınıf başlatma ve bellek temizleme ile uğraşmamak için.

 
mql5 :
 class cFather
 {
 public :
 int GetData() { return 3 ;}
 };
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 class cChild : public cFather
 {
 public :
 int GetData() { return 5 ;}
 };

 int f(cFather *p) { return p.GetData();}
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 int OnStart ()
 {
 cChild obj,*ptr= GetPointer (obj);
 f(ptr); // вернет 3
 ((cFather *)ptr).GetData(); // вернет 3

 return 0 ;
 }

Bu yapı nasıl "okunur"?

((cFather *)ptr).GetData();

Ve özellikle:

(cFather *)ptr)
Bakıyorum ve olan bitenin özüne tam anlamıyla dalmıyorum...
 
hoz :

Bu yapı nasıl "okunur"?

((cFather *)ptr).GetData();

ptr, cFather (sınıf) türüne dönüştürülür ve ( cFather ) yöntemi çağrılır GetData()

bunun gibi bir şey..

 
keekkenen :

ptr, cFather (sınıf) türüne dönüştürülür ve ( cFather ) yöntemi çağrılır GetData()

bunun gibi bir şey..

Bir çeşit teneke ... Ben de öyle düşündüm, ama .. bu bir türe (sınıf) getirmek için çok fazla. Programlamada ve bu yüzden duyduğum kadarıyla özel bir söz verilmesi tavsiye edilmiyor. Ve burada sadece standart bir türe değil, bir sınıfa da yayın yapılıyor.

Genel olarak, bu koda bir kez daha dönelim:

 class cFather
 {
 public :
 int GetData() { return 3 ;}
 };
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 class cChild : public cFather
 {
 public :
 int GetData() { return 5 ;}
 };

 int f(cFather *p) { return p.GetData();}
 //+------------------------------------------------------------------+
 //| |
 //+------------------------------------------------------------------+
 int OnStart ()
 {
 cChild obj,*ptr= GetPointer (obj);
 f(ptr); // вернет 3
 ((cFather *)ptr).GetData(); // вернет 3

 return 0 ;
 }

Burada f fonksiyonunun prototipinin parametrelerinde f fonksiyonunun parametre olarak cFather sınıfının bir yöntemini aldığı açıkça görülmektedir. BAŞLAT'taki kodun devamında aşağıdaki durumu görüyoruz:

 f(ptr); // вернет 3

Burada f işlevi, parametreleri cFather sınıfının bir yöntemini değil, görünüşe göre cChild sınıfının bir işaretçisini alır. Çünkü cChild nesne, *ptr = GetPointer( nesne);

mantık nedir?

 

mm .. mantık nerede?

f() yönteminde, mantık, gelen parametrenin cFather (veya ardılları) için doğru şekilde işleneceğidir.

 
keekkenen :

mm .. mantık nerede?

f() yönteminde, mantık, gelen parametrenin cFather (veya ardılları) için doğru şekilde işleneceğidir.

Onlar.

 int f(cFather *p) { return p.GetData();}

burada *p , cFather için bir işaretçi mi?

Aynı zamanda C++ öğreniyorum ve benzer kelimeler biraz kafamı karıştırıyor. İşaretçiler burada aynı olmasa da .

 
hoz :

Onlar.

burada *p , cFather için bir işaretçi mi?

Aynı zamanda C++ öğreniyorum ve benzer kelimeler biraz kafamı karıştırıyor. İşaretçiler burada aynı olmasa da .

cFather - işaretçi türü. İşaretçi değişkeninin kendisi sınıfın bir örneğine işaret eder.
 

Bir soru sormayalı birkaç hafta oldu. sormaya karar verdi. Orada çok fazla zorluk yok, ancak böyle bir seçeneğin gerçekleşip gerçekleşmediği mantıksal olarak ilginç. İşte kod:

 struct Name
  {
   string             first_name;                 // имя
   string             last_name;                   // фамилия
  };
class CPerson
  {
protected :
   Name              m_name;                     // имя
public :
   void               SetName( string n);
   string             GetName(){ return (m_name.first_name+ " " +m_name.last_name);}
private :
   string             GetFirstName( string full_name);
   string             GetLastName( string full_name);
  };
void CPerson::SetName( string n)
  {
   m_name.first_name=GetFirstName(n);
   m_name.last_name=GetLastName(n);
  }
string CPerson::GetFirstName( string full_name)
  {
   int pos= StringFind (full_name, " " );
   if (pos> 0 ) StringSetCharacter (full_name,pos, 0 );
   return (full_name);
  }
string CPerson::GetLastName( string full_name)
  {
   string ret_string;
   int pos= StringFind (full_name, " " );
   if (pos> 0 ) ret_string= StringSubstr (full_name,pos+ 1 );
   else       ret_string=full_name;
   return (ret_string);
  }

Bu kodda yalnızca 2 genel işlev vardır:

 public :
   void               SetName( string n);
   string             GetName(){ return (m_name.first_name+ " " +m_name.last_name);}

Ve 2 özel işlev, ihtiyaç anında doğrudan kamu veya daha doğrusu kamu işlevleri aracılığıyla çağrılır. void SetName(string n) işlevinde parametrenin n olması ve her iki private yönteminde de private: string GetFirstName(string full_name) ve string GetLastName(string full_name) nedense parametrenin aynı ayarlanmaması ilginçtir. Her ne kadar tam olarak bu kodu alsak da (başka bir şey değil), o zaman burada bu özel yöntemler, aynı parametrelerle ve başka hiçbir şey olmayan genel yöntemler aracılığıyla çağrılır. O halde parametrelere neden başka isimler verelim?

Umarım soru açıktır.