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

 
На каком основании отменили преобразование неконстантных объектов в константные? У меня перестали работать сотни внутренних методов, только потому что они не константные и видители теперь не могут использоваться в константых объектах. Сотни моих функций подвязаны на константный 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;
 
A100:

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

а не

Что бы работать со стандартными коллекциями класс не должен обладать константыми методами, потому что не в каждом классе такое возможно, однако каждый класс может использовать стандартные коллекции. Ограничение const накладывает внешняя функция и это ее право, но она не в праве накладывать ограничения на архитектуру сторонних объектов.
 
TheXpert:
A* B::a = new A;

Конструктор А не статический, попытка его вызвать естественно вызывает ошибку:

'A' - non static methods and members cannot be used.