Höyükte OOP hakkında konuşun - sayfa 15

 
Vladimir Pastushak :

Tam olarak nereye gidiyor?


Postayı kontrol et.

 

Merhaba moderatörler! Kabalık aldığım normal bir soru sordum, zaten yıkıyorsanız, operatörler ve işaretçiler hakkındaki saçmalıkları da yıkın.

Ve Sokolov'un OOP ile ilgili konularda görünmesine izin vermeyin, forumda OOP'nin bu tür savunucuları ile acı içinde ölecek

 
Комбинатор :

Merhaba moderatörler! Kabalık aldığım normal bir soru sordum, zaten yıkıyorsanız, operatörler ve işaretçiler hakkındaki saçmalıkları da yıkın.

Ve Sokolov'un OOP ile ilgili konularda görünmesine izin vermeyin, forumda OOP'nin bu tür savunucuları ile acı içinde ölecek

Kendi bakış açınıza göre herhangi bir şeyi netleştirdiniz mi? Numara.
Basit münakaşayı kaldırdım.
 

OOP'ye güzel bir örnek.

Graphics editor MT4
Graphics editor MT4
  • 2018.01.15
  • Evgeniy Serov
  • www.mql5.com
Утилита Graphics editor MT4 предназначена для создания и редактирования графических объектов типа: Удобный и интуитивно понятный интерфейс позволяет быстро и эффективно редактировать основные параметры графических объектов и сразу же видеть результат изменений. Входные параметры Languages - русский/английский; base_corner - угол привязки...
 
Artyom Trishkin :
Kendi bakış açınıza göre herhangi bir şeyi netleştirdiniz mi? Numara.
İki kelimelik soruda neyi açıklamalıydım?
 
Vasiliy Sokolov :

Operatörleri yeniden tanımlamak, sözdizimsel şekerden başka bir şey yapmaz. Bu uygulamayı bırakıp, atama operatörü yerine Copy() veya Clone() yöntemini kullanmak daha iyidir - basit ve net:

 class CMyClass
{
private :
   int m_state;
public :
   CMyClass* Copy()
   {
      CMyClass* obj = new CMyClass();
      obj.m_state = state;
       return obj;
   }
}


Yorumun için teşekkürler Vasily. Yaklaşımınıza küçük bir ekleme ile katılıyorum:

 //+------------------------------------------------------------------+
//| Тестовый класс                                                   |
//+------------------------------------------------------------------+
class CMyClass
  {
private :
   int                m_state;

public :
   //--- конструктор\деструктор
   void CMyClass(){m_state= WRONG_VALUE ;};
   void ~CMyClass(){};
   //--- копирование
   bool Copy( const CMyClass &_src_obj)
     {
       int source_state=_src_obj.m_state;
       if (source_state!= WRONG_VALUE )
        {
         this .m_state=source_state;
         return true ;
        }
       return false ;
     }
   //--- клонирование
   CMyClass *Clone( void )
     {
      CMyClass *obj= new CMyClass();
       if ( CheckPointer (obj)== POINTER_DYNAMIC )
         obj.m_state= this .m_state;
       return obj;
     }
   //--- set\get
   void State( const int _src_state)
     {
       this .m_state=_src_state;
     }
   int State( void ) const
     {
       return this .m_state;
     }
  };

Komut dosyasını kontrol edin:

 //+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//--- Объект 1
   CMyClass my_obj1;
   my_obj1.State( 5 );
   PrintFormat ( "Состояние Объекта 1: %d" ,my_obj1.State());
//--- Объект 2 - методом клонирования
   CMyClass *ptr_my_obj2;
   ptr_my_obj2=my_obj1.Clone();
   if ( CheckPointer (ptr_my_obj2)== POINTER_DYNAMIC )
       PrintFormat ( "Состояние Объекта 2: %d" ,ptr_my_obj2.State());
//--- Объект 3 - методом копирования
   CMyClass my_obj3;
   my_obj3.State( 3 );
   PrintFormat ( "Состояние Объекта 3: %d" ,my_obj3.State());
   if (my_obj1.Copy(my_obj3))
       PrintFormat ( "Состояние Объекта 1: %d" ,my_obj1.State());
  }

Standart karşılaştırma karakterleri en iyi şekilde işaretçilerin arkasında bırakılır.

İşaretçilerin arkasında ne anlama geliyor? Bu anlamda?

CMyClass* ptr1,ptr2;
ptr2=ptr1;
 
Aman Tanrım...
 
Комбинатор :
Aman Tanrım...
Sonraki ne?
Genellikle, bir gerekçe ve bir alternatif aşağıda verilmiştir.
 
Artyom Trishkin :
Kendi bakış açınıza göre herhangi bir şeyi netleştirdiniz mi? Numara.
Basit münakaşayı kaldırdım.

Nefret edenlerin, dahası okuma yazma bilmeyenlerin kışkırtmalarına boyun eğmeyeceğim, bunun yerine kendi bakış açımı açıklayacağım:

Normal programlama dillerinde ( C++ değil ) '=' operatörünün aşırı yüklenmesi yasaktır . Ve bazılarında , operatörün aşırı yüklenmesi neredeyse tamamen yasaktır, çünkü. oldukça haklı bir şekilde orada bir antipattern olarak kabul edilir. Böyle bir aşırı yüklenmeyi, özellikle atama operatörünü kullanmadan önce, bu aptal dillerin bu aptal mimarlarının bunu neden yaptığını düşünmenin iyi olduğunu öneriyorum.

Şahsen Andrei'ye karşı koyamadım: kahretsin, kendini böyle rezil etme. Sonuçta, açıkçası aptalca şeyleri donduruyorsunuz: önce FP hakkında, şimdi operatörler hakkında. Hile yapmak istiyorsanız - hoş geldiniz: yetkili kaynaklara bağlantılar sağlayın, iyi gerekçelendirin, vb. Ve şu anda yaptığınız şey, kuduz ve en önemlisi, kesinlikle okuma yazma bilmeyen bir nefret. Bir programcı gibisin, hatta gerçek bir programcı gibisin - şimdiden böyle şeyler yazmak çok yazık.

 
Dennis Kirichenko :

Artyom, yanılıyorsun. Nerede Kızlar? - Kızlar bizim fso'muz :-))

Ama cidden, burada tartışmak istediğim şey şu. Kendi kopya yapıcısının yazıldığı ve atama operatörünün yeniden tanımlandığı bir sınıf var. Soru. Ne zaman farklı olmalılar ve olmalılar?


Derleyicinin kendisi, bir sınıfın veya yapının tüm üyelerini basitçe kopyalayan basit bir kopya oluşturucu oluşturur.

Kopyalama sırasında bunun dışında başka işlemler yapmanız gerekirse, kendi kopya oluşturucunuzu tanımlayabilirsiniz.

ve bir atama operatörü.

Atama operatörü mevcut bir nesnede çağrılır, bu nedenle önce bir atamanın devam edip etmediğini kontrol etmesi gerekir.

sonra, gerekirse mevcut nesneyi serbest bırakın ve ardından yapıcı ile aynı şeyi yapın.