Singelton MQL4

 

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

Stacksinglton::getInstance().addOrderToStack(.......)

если кто знает, подскажите. я с++ не знаю. я понимаю ООП, знаю JAVA. но как это реализовать здесь mql пока не понял...

 
Самое простое: заведите экземпляр класса на глобальном уровне и потом обращайтесь к нему из любого места.
 

Скройте конструктор класса в приват области, так что бы только внутренние методы могли к нему обращаться. Создайте статический метод инициализации внутри этого класса. Он будет возвращать ссылку на единственный экзмепляр который и будет создавать если он еще не создан. Есть замечательная книга Паттерны проектирования, где эта техника подробно и доходчиво описана. Если Вы знакомы с Java то перенести этот код на MQL не составит труда.

 

знаком я даже взял кусок кода из С++

class Singleton
{
private: 
    Singleton() {}
    Singleton( const Singleton&);  
    Singleton& operator=( Singleton& );
public:
    static Singleton& getInstance() {
        static Singleton  instance;
        return instance;
    }    
}; 

но компилятор ругнулся:

'&' - reference cannot used OrdersStack.mqh 23 14

'&' - reference cannot used OrdersStack.mqh 25 21

'Singleton::Singleton' - cannot call private member function OrdersStack.mqh 26 27

 

Ну нельзя же настолько слепо сдирать...

Во-первых с приватным конструктором в MQL таки будут проблемы скорее всего.

Во-вторых в примере

    Singleton( const Singleton&);  
    Singleton& operator=( Singleton& );

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

В-третьих про ссылки в MQL можете забыть. Их нет и не будет

 
TheXpert:

Ну нельзя же настолько слепо сдирать...

Во-первых с приватным конструктором в MQL таки будут проблемы скорее всего.

Во-вторых в примере

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

В-третьих про ссылки в MQL можете забыть. Их нет и не будет


могли бы вы чуть подправить код, как нужно это сделать. идя такова что бы создать класс Стратегия1 и Стратегия2 и в них вызывать Stacksinglton::getInstance().addOrderToStack(.......)

p/s/ я не селен в с++ и никогда в нем не программировал. походу написание на mql вникаю что да как.

 

попробовал сделать так

class Singleton
{
private: 
    Singleton();
public:
    static Singleton getInstance() {
        return inctance;
    }    
}; 
Singleton::Singleton(){
}

компилятор выдает ошибки (я понимаю по чему)

'inctance' - undeclared identifier  
'return' - object required    

но когда я делаю так

class Singleton
{
private: 
    Singleton();
    static Singleton instance;
public:
    static Singleton getInstance() {
        return inctance;
    }    
}; 
Singleton::Singleton(){
}

тут компилятор ругается неожиданно для меня

'Singleton' - struct undefined  

при чем тут структура?

 

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

От сингетона какой выигрыш? Экономия на его единичной инициализации, в том случае, если при работе программы он не потребовался. Инициализация такого класса - это мизерные затраты. Ну и подумаешь, инициализировали его, а пользоваться не стали.

 
Integer:

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

От сингетона какой выигрыш? Экономия на его единичной инициализации, в том случае, если при работе программы он не потребовался. Инициализация такого класса - это мизерные затраты. Ну и подумаешь, инициализировали его, а пользоваться не стали.


я понимаю что объявить на глобальном уровне, но тогда использовать методы этого класса я смогу только в этом файле. а я хочу использовать метод этого класс (singleton) в любом другом, при этом когда используя метод addToStack(.....) в одном классе, я потом не перетер эти же данные в другом

 
В каком одном файле и в каком любом другом? Вы о чем?
 
файл эксперта. файл класса
Причина обращения: