Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я сделал так:
Но почему-то ошибок много при компиляции. Что не так?
Попытка переложить довольно простой Singleton Майерса на MQL4++ могла бы выглядеть, например, так:
Результат исполнения:
В статическом методе singleton() создаётся статическая переменная типа Symbol_Properties, но при компиляции выдаётся НЕправомерная ошибка доступа вызова конструктора по умолчанию, поскольку метод, хоть и статический, - имеет доступ ко всем членам, в том числе и private. Поэтому, из-за ошибки реализации MQL4++ пришлось этот конструктор поместить в public. Если исправят, - этого уже не надо будет делать.
По результату исполнения видно, что после вызова change() данные изменились. Это косвенно свидетельствует о том, что функция change() внутри себя получила адрес того же самого объекта, что был получен и в OnStart().
Сейчас, из-за ошибки в MQL4++, это - никакой не Singleton, поскольку таких объектов можно насоздавать много из-за того, что конструктор по умолчанию - public. Если ошибку исправят, и после помещения конструктора по умолчанию в секцию private, - станет полноценной реализацией Singleton'а Майерса на MQL4++.
вы за 2 дня страдания не разобрали что static ведет себя по разному в stuct и в class???
по ходу, структуры взяли с С и только немного прокачали в плане наследования,
что качается классов, то они полноценные.
Из-за этого в структурах не обязательно резервировать место под статик переменную
а в классах резервировать место надо иначе ни как:
Неправда, это замечательный компилятор MQL4++ ведёт себя по-разному. Стоит только создать экземпляр объекта, как поведение "выравнивается":
Почему-то это не компилируется (первое и третье - предупреждения, а, вот, второе - полноценная ошибка):
Так обязательно ли резервировать в структурах "место под static-переменную"?
А в следующей версии терминала/компилятора - это так же будет (ну, чтобы не бросаться исправлять всё прежде написанное при смене версии)?
Про инкапсуляцию забыл. И удалить можно. А здесь константных указателей нет ) Да и вообще синглтон не лучший паттерн.
А шаблоны хорошо хоть какие-то есть. Для классов наверное только мечтать.
Ну, худший он, или лучший, судить не стану.
Напомню участникам обсуждения, что неоднократно упомянутые выше РЕЖИМЫ УПРАВЛЕНИЯ ПАМЯТЬЮ - Automatic, Dynamic, Static, Based - не применимы к шаблонам, как бы ни был могуч ООП.
Сейчас, из-за ошибки в MQL4++, это - никакой не Singleton, поскольку таких объектов можно насоздавать много из-за того, что конструктор по умолчанию - public. Если ошибку исправят, и после помещения конструктора по умолчанию в секцию private, - станет полноценной реализацией Singleton'а Майерса на MQL4++.
Спасибо, не знал что можно тут брать указатель.
С кодом что то вы намудрили, можно проще, жаль нет шаблонов.
не могу вставить код ((
class Singleton{
private:
class SomeClass{
public:
int a;
};
Singleton(){}
~Singleton(){}
public:
static SomeClass* Instance(){
static SomeClass a();
return GetPointer (a);
}
};
void OnStart()
{
SomeClass* some_ptr = Singleton::Instance();
some_ptr.a = 5;
Alert(some_ptr.a);
}
Спасибо, не знал что можно тут брать указатель.
С кодом что то вы намудрили, можно проще, жаль нет шаблонов.
не могу вставить код ((
class Singleton{
private:
class SomeClass{
public:
int a;
};
Singleton(){}
~Singleton(){}
public:
static SomeClass* Instance(){
static SomeClass a();
return GetPointer (a);
}
};
void OnStart()
{
SomeClass* some_ptr = Singleton::Instance();
some_ptr.a = 5;
Alert(some_ptr.a);
}
Вот код Майерса для C++:
А вот - этот же код, переложенный на MQL4++, и являющийся технической частью класса в примере:
Где же тут "мудрёж"?
Ваш пример эксплуатирует ошибки компилятора MQL4++, в частности, использование типа SomeClass в OnStart() - НЕправомерно, потому что это вложенный тип класса Singleton, и "взрослый" компилятор мгновенно обнаруживает ошибку:
Однако это не слишком принципиальный момент, поскольку вложенный тип можно указать правильно. Куда принципиальнее то, что тип SomeClass объявлен в секции private класса Singleton, и поэтому использование SomeClass в OnStart() теперь уже принципиально НЕправомерно, о чём "взрослый" компилятор немедленно докладывает:
Ваша реализация будет работать, если в компиляторе MQL4++ так и не исправят вакханалию с контролем доступа.
1. Маерс, не Маерс, какая в ...опу разница ,главное что бы код работал и делал то что надо и без ошибок В MQL, а не в ++.
2. Ваш код делает то что надо? Неа и точка. Напишите в сервисдеск, зачем столько ныть все уже все поняли, кто хотел и мог.
3. Мой пример показал способ обхода ошибок (относительно С++) в MQL, если что-то не нравится смотрите пунк 1 и 2.
4. Касаемо создание указателя на приватный класс - да это промашка MQL, но здесь нет auto чтобы самоопределить тип, по этому хорошо что так работает. \
(п.с. на счет auto может переборщил, надо проверить)
5. Я не нашел способа как в MQL разыменовывать указатель, чтобы получить объект, по этому считаю приватный конструктор копирования и оператор присваивания излишними.
попытайтесь их использовать, буду рад увидеть способ))
1. Маерс, не Маерс, какая в ...опу разница ,главное что бы код работал и делал то что надо и без ошибок В MQL, а не в ++.
2. Ваш код делает то что надо? Неа и точка. Напишите в сервисдеск, зачем столько ныть все уже все поняли, кто хотел и мог.
3. Мой пример показал способ обхода ошибок (относительно С++) в MQL, если что-то не нравится смотрите пунк 1 и 2.
4. Касаемо создание указателя на приватный класс - да это промашка MQL, но здесь нет auto чтобы самоопределить тип, по этому хорошо что так работает. \
(п.с. на счет auto может переборщил, надо проверить)
5. Я не нашел способа как в MQL разыменовывать указатель, чтобы получить объект, по этому считаю приватный конструктор копирования и оператор присваивания излишними.
попытайтесь их использовать, буду рад увидеть способ))
1. Сейчас - делает, но НЕ то, что надо (пояснения ниже).
2. Если не исправят - и не будет делать. И вряд ли реализуемо будет вообще.
3. Это не способ обхода ошибок, а их эксплуатация.
4. Здесь много, чего нет.
5. В данной версии подобные вещи могут быть возможны, в частности, кажется, у меня промелькивало перед глазами, что конструктор копии не синтезируется, но это не гарантирует, что в следующих версиях он не начнёт синтезироваться. Накладные же расходы на их декларирование, считаю, ничтожны.
Теперь пояснения, почему ваш код не только имеет потенциальные проблемы, о которых я упомянул в предыдущем сообщении, но и почему он в принципе не является singleton'ом и не будет, причём, вне зависимости, исправят вакханалию с доступом или нет:
Данный код вполне себе успешно исполняется:
Видите, сколько singleton'ов удалось создать, причём они ОДНОВРЕМЕННО существуют?
Что-нибудь в этом смысле для вашего кода поменяется, если исправят вакханалию с доступом?
А в моём коде - поменяется?
Думаете, чем безапеляционнее изложите мысль, тем она вернее будет?
да, спасибо за внимательность, вы правы, в данном варианте это тоже не сингелтон.
По поводу неявных конструкторов и операторов - сделайте их явными и попробуйте их использовать, мне кажется не получится в виду невозможности разименовать указатель до объекта
По чему не работает, 'ptr' - cannot call protected member function :
да, спасибо за внимательность, вы правы, в данном варианте это тоже не сингелтон.
По поводу неявных конструкторов и операторов - сделайте их явными и попробуйте их использовать, мне кажется не получится в виду невозможности разименовать указатель до объекта
По чему не работает, 'ptr' - cannot call protected member function :
Кажется не кажется, а косяков тут ещё много. Жаль, что это замечают еденицы. Я не хочу влезать в полемику, но на самом деле, разница огромнейшая. Некоторые вещи, которые применимы к структурами в С++ в МКЛ4 не работают. Но я промолчу... а то начнут опять задавать вопросы типа:
"Зачем мне это нужно".
Да хоть затем, чтоб можно было не лезть в недоделанный учебник, а просто писать то, то работает в С++ на МКЛ4 и не задумываться работает ли это тут или нет. Больше ничего не нужно мне на данном этапе...