Разговоры на завалинке о ООП - страница 15

 
Vladimir Pastushak:

Где идет во всю ?


Почту проверьте.

 

Але, модераторы! Я задал нормальный вопрос, на который получил хамство, если уж сносите, то бред про операторы и указатели сносите тоже.

И не давайте соколову вообще появляться в темах про ООП, с такими защитниками ООП на форуме загнется в муках

 
Комбинатор:

Але, модераторы! Я задал нормальный вопрос, на который получил хамство, если уж сносите, то бред про операторы и указатели сносите тоже.

И не давайте соколову вообще появляться в темах про ООП, с такими защитниками ООП на форуме загнется в муках

Вы что-либо пояснили по вашей точке зрения? Нет. 
Я удалил простую склоку.
 

Хороший пример на тему ООП.

Graphics editor MT4
Graphics editor MT4
  • 2018.01.15
  • Evgeniy Serov
  • www.mql5.com
Утилита Graphics editor MT4 предназначена для создания и редактирования графических объектов типа: Удобный и интуитивно понятный интерфейс позволяет быстро и эффективно редактировать основные параметры графических объектов и сразу же видеть результат изменений. Входные параметры Languages - русский/английский; base_corner - угол привязки...
 
Artyom Trishkin:
Вы что-либо пояснили по вашей точке зрения? Нет.
Что я должен был пояснить в вопросе из двух слов?
 
Vasiliy Sokolov:

Переопределение операторов ничего кроме синтаксического сахара не дает. Лучше отказаться от этой практики и вместо оператора присваивания использовать метод Copy() или Clone() - просто и понятно:

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


Василий спасибо за мнение. Пожалуй соглашусь с твоим подходом, с небольшим дополнением:

//+------------------------------------------------------------------+
//| Тестовый класс                                                   |
//+------------------------------------------------------------------+
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;
     }
  };

Проверочный скрипт:

//+------------------------------------------------------------------+
//| 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());
  }

Стандартные символы сравнения лучше оставить за указателями.

Что значит за указателями? В таком смысле?

CMyClass* ptr1,ptr2;
ptr2=ptr1;
 
О господи...
 
Комбинатор:
О господи...
Далее что?
Обычно далее даётся обоснование и свой вариант.
 
Artyom Trishkin:
Вы что-либо пояснили по вашей точке зрения? Нет. 
Я удалил простую склоку.

Не буду поддаваться на провокации хейтеров, к тому же безграмотных, а лучше поясню свою точку зрения:

В нормальных языках программирования (не С++перегрузка оператора '=' запрещена. А в некоторых перегрузка операторов запрещена практически полностью, т.к. совершенно заслужено там считается антипаттерном.  Предлагаю желающим, прежде чем использовать любую подобную перегрузку, особенно оператор присваивания, хорошо подумать над тем, почему эти глупые архитекторы этих глупых языков так делают.

Не удержался, лично андрею: блин, ну не позорься так. Ведь откровенно глупые вещи морозишь: сначала про ФП, теперь про операторы. Хочешь похейтерить - welcome: приводи ссылки на авторитетные источники, обосновывай ну и т.д. А то, что ты делаешь сейчас это оголотелый и главное абсолютно безграмотный хейт. Ты ж вроде программист, вроде даже настоящий - стыдно уже такие вещи писать.

 
Dennis Kirichenko:

Артём, Вы не правы. Куда ж без девок? - Девки наше фсё :-))

А если серьёзно, то вот хочу что обсудить. Есть класс, где написан свой конструктор копирования и переопределён оператор присваивания. Вопрос. Когда они должны отличаться и должны ли? 


Компилятор сам создаёт простой конструктор копирования, который просто копирует все члены класса или структуры.

Если нужно чтобы при копировании выполнялись ещё какие-то действия кроме этого, можно определить свой конструктор копирования

и оператор присваивания.

Оператор присваивания вызывается для существующего объекта, поэтому он должен сначала проверить не идет ли присваивание

самого себя, потом, при необходимости, освободить существующий объект, а потом делать то же, что и конструктор.

Причина обращения: