Будущее MQL5 - MQL5+ или даже MQL6 - страница 11

 
Alexey Kozitsyn:

Дак все уже придумали. Используйте константу NULL.

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

И это давно уже можно делать. Из навигатора перетаскиваете индикатор в окно с уже прикрепленным индикатором.

ИМХО, не самая нужная вещь.

Есть навигатор, есть избранное, есть шаблоны, есть профили. Все можно настроить. Читайте справку по терминалу, откроете для себя много нового!

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

Например, значения перечисления ENUM_DAY_OF_WEEK можно использовать для сравнения со значением day_of_week структуры MqlDateTime. Т.е. можно написать так:

 

А можно написать иначе: 

SUNDAY - это именованная константа типа int со значением 0.

Как Вы думаете, как будет понятнее человеку, читающему код?

Прикольно! Спасибо за навигатор! Не уделял ему должного внимания. Обычно выключаю его, что б место не занимал. Справку, пусть мельком, но читал. И о перетаскивании индюков в окно графиков и друг на друга там нет ничего. Хотя, можно было бы и догадаться, сделать попытку....)))

Спасибо за объяснение сути перечислений! Но с ними я разобрался быстро, благо MQL это в основном калька с C++, и доков на него масса. А вот куча опечаток в справке и неполные статьи - это не хорошо.

Итог. При грамотно написанной справке, кучу дурацких вопросов от чайников на форуме можно избежать!

По части NULL это ноль - он используется часто. А вот максимальные значения переменных крайне редко, практически никогда. Например переменная хранит три состояния после анализа индикаторов: КУПИТЬ, ПРОДАТЬ или НИЧЕГО. Если использовать готовые константы POSITION_TYPE_BUY, POSITION_TYPE_SELL, то одна из них ноль. Уверен, что EMPTY_VALUE будет популярнее NULL, если ее обобщить на все типы.))

 
Alexander Puzanov:

Есть ещё одно бескрайне полезное применение. Напр:

И пользователь получает выпадающий список с выбором из 4х пунктов того, что вы там прописали в комментах - "только Buy", "только Sell" итд. Оч удобно для перечисления набора индикаторов, таймфреймов, набора условий и др. в окне пользовательских настроек

Да, конечно! В данном случае еще можно добавить, что упрощает механизм проверки программой введенных пользователем значений. Т.е. все они (корректные значения) описаны изначально.
 
agvozdezkiy:

По части NULL это ноль, а он используется часто. Например переменная хранит три состояния после анализа индикаторов: КУПИТЬ, ПРОДАТЬ или НИЧЕГО. Если использовать готовые константы POSITION_TYPE_BUY, POSITION_TYPE_SELL, то одна из них ноль.

Да не вопрос, можно сделать так:

#define VALUE_EMPTY -1       // Пустое значение для числовых типов данных
#define STR_VALUE_EMPTY ""   // Пустое значение для строкового типа

 И подставляйте куда хотите.

 
Alexey Kozitsyn:

Да не вопрос, можно сделать так:

 И подставляйте куда хотите.

Все это понятно. Я не об этом.
 
agvozdezkiy:
Все это понятно. Я не об этом.

Тогда поясните о чем Вы? О единой константе под все предопределенные типы данных? Вряд ли такое реализуют.

 
Renat Fatkhullin:

К сожалению, полезность и важность такого предупреждения понимают только умудренные опытом программисты.

Ну а всем остальным рекомендую радоваться такому уровню помощи компилятора и исправлять свои ошибки. Это реальные места потенциальных ошибок и именно начинающим разработчикам это критически важно для обучения. 

А namespace сделаете? Тогда и проблема бы решилась.
 

Несколько лет назад на форуме уже поднимали тему "чисто виртуальных методов".

Т.е. в концепции с++, виртуальных методов без тела, которые должны быть ОБЯЗАТЕЛЬНО переопределены в потомках:

virtual void Func1() = 0;

К тому же, класс содержащий такие методы автоматически становится абстрактным. Компилятор это тоже сам отслеживает. (Ну это чтобы совсем придерживаться стандартов, хотя можно спрятать конструктор в защищенную область видимости) 

Сейчас поведения "чисто виртуальных методов" сильно не хватает. Без такого функционала нельзя нормально подготовить библиотеку или фреймворк чтобы отдать его на сторону: создаешь свой класс-потомок (который не просто так, а встраивается как шестеренка в другие классы) и будь добр выполнить весь интерфейс. Сейчас же, унаследовал, не вписал реализацию метода, компилятор проглотил, нифига не работает. Копайся в исходниках родительского класса? 

Понятие интерфейса одно из основополагающих в ООП. Поэтому очень бы хотелось реализации такой штуки не в MQL6, а в 5-ке

 

Кстати, в документации по виртуальным функциям, ошибка -

Виртуальная функция, как и обычная функция, должна иметь исполняемое тело. При вызове семантика ее точно такая же, как и у остальных функций.

 Пример:

class Base {
private:
        int a;
public:
        virtual int Func1();
};


class Second: public Base {
public:
        int Func2() {
                return 0;
        };      
};

int OnInit() {

        Base* base = new Base();
        Second* foo = new Second();
   return(INIT_SUCCEEDED);
}

 Виртуальная функция Func1 не имеет исполняемого тела (и даже значение не возвращает), но компилируется без ошибок.

 
Igor Volodin:

Несколько лет назад на форуме уже поднимали тему "чисто виртуальных методов".

Т.е. в концепции с++, виртуальных методов без тела, которые должны быть ОБЯЗАТЕЛЬНО переопределены в потомках:

К тому же, класс содержащий такие методы автоматически становится абстрактным. Компилятор это тоже сам отслеживает. (Ну это чтобы совсем придерживаться стандартов, хотя можно спрятать конструктор в защищенную область видимости) 

Сейчас поведения "чисто виртуальных методов" сильно не хватает. Без такого функционала нельзя нормально подготовить библиотеку или фреймворк чтобы отдать его на сторону: создаешь свой класс-потомок (который не просто так, а встраивается как шестеренка в другие классы) и будь добр выполнить весь интерфейс. Сейчас же, унаследовал, не вписал реализацию метода, компилятор проглотил, нифига не работает. Копайся в исходниках родительского класса? 

Понятие интерфейса одно из основополагающих в ООП. Поэтому очень бы хотелось реализации такой штуки не в MQL6, а в 5-ке

 

Кстати, в документации по виртуальным функциям, ошибка -

 Пример:

 Виртуальная функция Func1 не имеет исполняемого тела (и даже значение не возвращает), но компилируется без ошибок.

1. Чисто виртуальные (pure virtual) функции будут добавлены в ближайшее время

2. А где в Вашем примере вызов Func1? Нет вызова - нет и контроля наличия тела.

 
Slawa:

1. Чисто виртуальные (pure virtual) функции будут добавлены в ближайшее время

2. А где в Вашем примере вызов Func1? Нет вызова - нет и контроля наличия тела.

VS 2015 сказала следующее

Severity Code Description Project File Line Suppression State

Error LNK2001 unresolved external symbol "public: virtual int __thiscall Base::Func1(void)" (?Func1@Base@@UAEHXZ) TestCPPCode C:\MyP\AvForex\trunk\TestCPPCode\TestCPPCode.obj 1

Error LNK1120 1 unresolved externals TestCPPCode C:\MyP\AvForex\trunk\MQL4FilesForFormatting2015\Debug\TestCPPCode.exe 1

 
Alexey Volchanskiy:

VS 2015 сказала следующее

Severity Code Description Project File Line Suppression State

Error LNK2001 unresolved external symbol "public: virtual int __thiscall Base::Func1(void)" (?Func1@Base@@UAEHXZ) TestCPPCode C:\MyP\AvForex\trunk\TestCPPCode\TestCPPCode.obj 1

Error LNK1120 1 unresolved externals TestCPPCode C:\MyP\AvForex\trunk\MQL4FilesForFormatting2015\Debug\TestCPPCode.exe 1

Исходный код покажите
Причина обращения: