Ошибки, баги, вопросы - страница 1135

 
Fleder:
Выложите, пожалуйста, весь Ваш код.
Это пример из документации mql5. Вот ссылка на ту страницу. А ниже этот код.
//+------------------------------------------------------------------+
//| Класс с конструктором по умолчанию                               |
//+------------------------------------------------------------------+
class CFoo
  {
   datetime          m_call_time;     // время последнего обращения к объекту
public:
   //--- конструктор с параметром, имеющем значение по умолчанию, не является конструктором по умолчанию
                     CFoo(const datetime t=0){m_call_time=t;};
   //--- конструктор копирования 
                     CFoo(const CFoo &foo){m_call_time=foo.m_call_time;};
 
   string ToString(){return(TimeToString(m_call_time,TIME_DATE|TIME_SECONDS));};
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// CFoo foo; // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- допустимые варианты создания объекта CFoo
   CFoo foo1(TimeCurrent());     // явный вызов параметрического конструктора
   CFoo foo2();                  // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3=D'2009.09.09';      // неявный вызов параметрического конструктора
   CFoo foo40(foo1);             // явный вызов конструктора копирования
   CFoo foo41=foo1;              // неявный вызов конструктора копирования
   CFoo foo5;                    // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
//--- допустимые варианты получения указателей CFoo
   CFoo *pfoo6=new CFoo();       // динамическое создание объекта и получение указателя на него
   CFoo *pfoo7=new CFoo(TimeCurrent());// ещё один вариант динамического создания объекта
   CFoo *pfoo8=GetPointer(foo1); // теперь pfoo8 указывает на объект foo1
   CFoo *pfoo9=pfoo7;            // pfoo9 и pfoo7 указывают на один и тот же объект
   // CFoo foo_array[3];         // такой вариант использовать нельзя - конструктор по умолчанию не задан
//--- выведем значения m_call_time
   Print("foo1.m_call_time=",foo1.ToString());
   Print("foo2.m_call_time=",foo2.ToString());
   Print("foo3.m_call_time=",foo3.ToString());
   Print("foo4.m_call_time=",foo4.ToString());
   Print("foo5.m_call_time=",foo5.ToString());
   Print("pfoo6.m_call_time=",pfoo6.ToString());
   Print("pfoo7.m_call_time=",pfoo7.ToString());
   Print("pfoo8.m_call_time=",pfoo8.ToString());
   Print("pfoo9.m_call_time=",pfoo9.ToString());
//--- удалим динамически созданные объекты
   delete pfoo6;
   delete pfoo7;
   //delete pfoo8;  // удалять pfoo8 явно не нужно, так как он указывает на автоматически созданный объект foo1
   //delete pfoo9;  // удалять pfoo9 явно не нужно, так как он указывает на тот же объект, что и pfoo7
  }
 
Tron_KZ:
Это пример из документации mql5. Вот ссылка на ту страницу. А ниже этот код.

Похоже, что с обновлением ввели не только обязательное размещение статических членов-данных класса,

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

Используйте явный вызов:

   CFoo foo1(TimeCurrent());     // явный вызов параметрического конструктора
   CFoo foo2();                  // явный вызов параметрического конструктора с параметром по умолчанию
   CFoo foo3(D'2009.09.09');     // явный вызов параметрического конструктора
   CFoo foo4(foo1);              // явный вызов конструктора копирования
   CFoo foo5;                    // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,
                                 // то вызывается параметрический конструктор с параметром по умолчанию)
 
На каком основании отменили преобразование неконстантных объектов в константные? У меня перестали работать сотни внутренних методов, только потому что они не константные и видители теперь не могут использоваться в константых объектах. Сотни моих функций подвязаны на константный CObject.Compare(...) и теперь все они не работают! 
 
Похоже ООП в mql5 претерпел конкретные изменения. В тихушку...
 
C-4:
На каком основании отменили преобразование неконстантных объектов в константные?

Все компилируется нормально - без ошибок и предупреждений

class A {};
void f( const A& a ) {}
void OnStart()
{
        A a; //не const A
        f( a );
}
Если там и остались какие то ошибки - то только в struct, но и до них со временем доберутся
 
A100:

Все компилируется без ошибок и предупреждений

Если "А" содержит неконстантый метод, но сам передается в функцию как константый объект, то вызвать в функции этот неконстантный метод теперь невозможно.

class A 
{
   public:
      void PrintMyName(){printf("my name A");}
};

void f(const A* a)
{
   a.PrintMyName(); //Хренушки. Теперь PrintMyName должен быть константым.
} 

void OnStart()
{
        A a; //не const A
        f(GetPointer(a));
}

А теперь внимание вопрос: сотрим сигнатуру CObject.Compare():

virtual int  Compare(
   CObject const *  node,       // элемент 
   int            mode=0      // вариант 
   ) const
О.к. это константый метод принимающий константый объект node. Объявлять node константым это его право. Но на каком основании теперь Compare должен работать только с константыми методами node? Node не обязан иметь константные методы в угоду Compare. Но получается что лишь на том основании что объект сложный и не имеет константых методов, теперь он не может исопльзовать стандартную библеотеку со всеми вытекающими!!!

 

 
mql5:
Теперь статические члены обязательно размещать.

И как прикажете размещать сложные статические объекты, если статические конструкторы запрещены?

class A 
{
   public:
      void PrintMyName(){printf("my name A");}
};

class B
{
   public:
      static A* a; //В этом месте как прикажете объект инициализировать? 
};
 
C-4:

Если "А" содержит неконстантый метод, но сам передается в функцию как константый объект, то вызвать в функции этот неконстантный метод теперь невозможно.

Все верно, так и должно быть, иначе какой смысл указывать

void f(const A* a)

а не

void f(A* a)
 
C-4:

Если "А" содержит неконстантый метод, но сам передается в функцию как константый объект, то вызвать в функции этот неконстантный метод теперь невозможно.

Эмм, это вообще-то по феншую так.
 
C-4:

И как прикажете размещать сложные статические объекты, если статические конструкторы запрещены?

class A 
{
   public:
      void PrintMyName(){printf("my name A");}
};

class B
{
   public:
      static A* a;
};

A* B::a = new A;
Причина обращения: