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

 
Artyom Trishkin #:

Спасибо. Нужно будет проверить. Всегда объявлял в производных тоже виртуальными. 

Я то же объявляю, но это не обязательно

 
Andrey Dik #:
Понятно. Жаль, потому что при "=" придется сначала объявлять объекты а потом присваивать массиву, это увеличит код как минимум в два раза (хотя, благо, это нужно сделать всего один раз, а далее просто обращаться к массиву через цикл).

Не заморачиваюсь и пишу лаконично. Потенциальная проблема здесь.

class A { public: int i; };

void OnStart()
{
  const A a; // Создан const-объект - запрет на изменение полей, разрешается вызывать только const-методы.
  
  Print(a.i);
  
  ((A*)&a).i = 5; // В const-объекте все равно изменили поле.
  Print(a.i); // 5
  
  ((A)a).i = 7;   // В const-объекте все равно изменили поле.
  Print(a.i); // 7  
}

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

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

Это правильное поведение.
 
Andrey Dik #:
Понятно. Жаль, потому что при "=" придется сначала объявлять объекты а потом присваивать массиву, это увеличит код как минимум в два раза (хотя, благо, это нужно сделать всего один раз, а далее просто обращаться к массиву через цикл).

В данном случае уместна будет запись в строку и нумерация с 0:

C_Ind *inds[2];
C_Ind *ave0 = new C_AVE0(); inds[0] = ave0;
C_Ind *ave1 = new C_AVE1(); inds[1] = ave1;
 
A100 #:

В данном случае уместно будет запись в строку:

Объект может не создаться. Невалидный указатель в массиве тогда будет.

 
Artyom Trishkin #:

Объект может не создаться. Невалидный указатель в массиве тогда будет.

Согласен - еще один аргумент против {} и мнимой лаконичности

Тем более, что создание одного объекта может зависеть от предыдущего и ошибка в 1ом наверняка должна препятствовать созданию остальных
C_Ind *inds[2];
C_Ind *ave0 = new C_AVE0(); if ( !(inds[0] = ave0) ) return;
C_Ind *ave1 = new C_AVE1(); if ( !(inds[1] = ave1) ) return;
return после обработки ошибки
 
Здесь уже и макрос напрашивается:
#define MACRO(X) \
C_Ind  *ave##X = new C_AVE##X(); \
if ( !(inds[X] = ave##X) ) \
{                \
/*что делать в случае ошибки*/ \
    return;      \
}

C_Ind *inds[2];
MACRO(0);
MACRO(1);
 
A100 #:

Согласен - еще один аргумент против {} и мнимой лаконичности

Тем более, что создание одного объекта может зависеть от предыдущего и ошибка в 1ом должна препятствовать созданию остальных return после обработки ошибки

ага, здорово!

ретурн в инициализации советника. удобно работать таким образом, учитывая что таких сущностей-индикаторов несколько десятков.

 

Зачем формируется шапка/рамка тут при использовании Стилизатора?

enum ENUM_vibros_type_NAME //Определяет метод преобразования выбросов
{
   type_Granica=0,//Значение выбросов преобразовываются в близкое к сплиту значение
   type_Random=1,//Значение выбросов преобразовываются в случайное значение в диапазоне вне выбросов
};
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input ENUM_vibros_type_NAME Vibros_type=ENUM_vibros_type_NAME(0);//Метод выбора весов объектов

Мне она кажется явно лишней.

 
Aleksey Vyazmikin #:

Зачем формируется шапка/рамка тут при использовании Стилизатора?

Мне она кажется явно лишней.

Если не хотите шапку, то теоретически можно так было бы написать:

input enum ENUM_vibros_type_NAME //Определяет метод преобразования выбросов
{
   type_Granica=0,//Значение выбросов преобразовываются в близкое к сплиту значение
   type_Random=1,//Значение выбросов преобразовываются в случайное значение в диапазоне вне выбросов
} Vibros_type = type_Granica;

Но в MQL почему то такая запись выдает ошибку !?

 
Более того, даже такие записи (без input) выдают ошибку при компиляции:
static enum ENUM { //Error: 'ENUM' - enumeration cannot have modifiers
   a,
   b
} const e = a;

const enum ENUM { //Error: 'ENUM' - enumeration cannot have modifiers
   a,
   b
} e = a;
enum ENUM {
   a,
   b
} const e = a; //Error: 'const' - semicolon expected