условное создание объектов класса - страница 2

 

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

delete this это вообще извращение, особенно в данном ключе

 
Andrei Trukhanovich:

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

delete this это вообще извращение, особенно в данном ключе

Вопрос был не про эстетику, а про возможность завершения работы конструктора без создания объекта класса.

И ответ - возможно. Оба предложенных варианта (со статической функцией и delete this) рабочие.

Нужно ли это делать, это уже другой вопрос и личный выбор каждого.


Уважаемые гуру, помогите еще с одной проблемой.

Есть мой класс СTimeFrame потомок CObject. В нем есть виртуальная функция Compare.

virtual  int      Compare(const CTimeFrame *node, const int mode=0);

Далее объекты СTimeFrame добавляются в класс CList.

При дальнейшей сортировке CList, вижу в отладчике, что  обращение происходит к CObject::Compare, а не к СTimeFrame::Compare, соответственно и сортировка не происходит.

Что делаю не так?

 
Alexandr Atagyan:

Вопрос был не про эстетику, а про возможность завершения работы конструктора без создания объекта класса.

И ответ - возможно. Оба предложенных варианта (со статической функцией и delete this) рабочие.

Нужно ли это делать, это уже другой вопрос и личный выбор каждого.


Уважаемые гуру, помогите еще с одной проблемой.

Есть мой класс СTimeFrame потомок CObject. В нем есть виртуальная функция Compare.

Далее объекты СTimeFrame добавляются в класс CList.

При дальнейшей сортировке CList, вижу в отладчике, что  обращение происходит к CObject::Compare, а не к СTimeFrame::Compare, соответственно и сортировка не происходит.

Что делаю не так?

Похоже параметры функции не совпадают.

Допишите override и компилятор покажет ошибку

virtual  int      Compare(const CTimeFrame *node, const int mode=0) override;

Похоже первый параметр должен быть const CObject*, а не const CTimeFrame*

 
Ilya Baranov:

Похоже параметры функции не совпадают.

Допишите override и компилятор покажет ошибку

Похоже первый параметр должен быть const CObject*, а не const CTimeFrame*

'CTimeFrame::Compare' method is declared with 'override' specifier, but does not override any base class method

как так?

Некоторое время назад он нормально работал. Ошибка появилась после того как я начал модифицировать  СTimeFrame::Compare (добавил обработку значения mode отличного от 0).

Вернул все назад, но не помогло.


 

Похоже первый параметр должен быть const CObject*, а не const CTimeFrame*

у  CObject нет полей данных которые нужно сравнивать в Compare.

 
Alexandr Atagyan:

у  CObject нет полей данных которые нужно сравнивать в Compare.

внутри компаратора скастуйте к нужному типу, получите нужные поля

 
Maxim Kuznetsov:

внутри компаратора скастуйте к нужному типу, получите нужные поля

 можно подробнее как это сделать?

 

заменил  CTimeFrame на  CObject в  СTimeFrame::Compare

и закомментил все содержимое СTimeFrame::Compare, кроме return(0);

Всеравно выполнение передается в CObject мимо СTimeFrame .

 
class CTimeFrame   : public CObject
  {
protected:
   void              Name(int period=0);
public:
   string            m_name;
   int               m_period;
   
   double            high[];
   double            low[];
   double            open[];
   double            close[];
   datetime          time_open[];
   datetime          time_close[];
   
   virtual int       Compare(const CObject *node,const int mode=0);
   
                     CTimeFrame(int period=0){Name(period);};
                    ~CTimeFrame(void){};
  };
int   CTimeFrame::Compare(const CObject *node, const int mode=0)
   {    
//      if(node.m_period>this.m_period)
//         return(-1);
//      if(node.m_period<this.m_period)
//         return(1);
      return(0);
   }
 
Alexandr Atagyan:
int CTimeFrame::Compare(const CObject *node, const int mode=0)
  {    
   const CTimeFrame *obj_compared=node;
   if(this.m_period>obj_compared.m_period) return(1);
   else if(this.m_period<obj_compared.m_period) return(-1);  
   return 0;
  }