Пишу бибилотеки для написания совков. Появилась необходимость написать 2 статических класса. Статических классов как я понял не создашь, но классы со статическими методами и членами создать можно. Мне разницы нет и желания что-то выдумывать тоже нет, поэтому я решил написать так как понимаю опираясь на свой опыт в других языках.
С одним классом всё получилось удачно.
Вот сам класс и присвоение статическим переменным их значений:
В даном примере статическим переменным присваиваются значения в том же классе, членами которого они и являются. Здесь вопросов нет, вопрос решён.
Дальше я написал ещё несколько классов и наткнулся на грабли. Обычно, подобоные вопросы решаются легко, но мкл4 как-то с наскока на решилось.
В общем-то, есть класс ErrorsHandling, в котором есть статическая переменная:
Мне нужно иметь возможность переменной m_errorInfo задать значение из другого класса. Сеттер нормальный написать у меня вообще не получилось, поэтому этот вопрос я опускаю и забил. Но вот присвоить значение из другого класса, куда я уже импортировать тот класс ErrorsHandling не получается. Хотя пишу так же...
Это вообще возможно? Если такой возможность нет, тогда нет вообще смысла в статических переменным. Придётся объекты создавать, а это лишняя память и тд...
Попробуйте реализовать методы чтения и записи. Property свойства реализовать не получится, но всё же.
class GeneralData { private: static const string m_expertName; // Имя инструмента выводимого на график protected: static const bool m_realTrade; // Флаг торговли On-line static const bool m_virtualTrade; // Флаг оптимизации public: //---- Конструктор и деструктор GeneralData(); ~GeneralData(void); //---- string expertName(){ // Чтение return m_expertName; } bool expertName(string i_expertName){ // Запись m_expertName = i_expertName; return true; } };
ErrorsHandling::m_errorInfo = "Hello World!";
Сделайте переменные которым вы собираетесь менять динамично значения public и делайте с ними что хотите, в рамках возможного.
У меня и так переменная m_errorInfo доступна из всех мест, т.к. она паблик. Я же выше показал в коде.
В общем, я тут покрутил, повертел. Кое-что сдвинулось. Но вот остался момент интересный. Вот код:
//---- Проверяем на условия FREEZELEVEL и STOPLEVEL if (!CheckLevelsBLOCK (Sym, Pos, 3, Pos.openPrice, bFixInvalidPrice)) { if (StringLen (ErrorsHandling :: m_errorInfo) > 0) { Logging::WriteLog (CErrs.ErrInf); return (false); } }
Переменная m_errorInfo из класса ErrorsHandling почему-то не вызывается. Мне нужно нужно есс-но узнать, длина m_errorInfo больше нуля или нет. Компилятор ругается..
Так вот в строке:
if (StringLen (ErrorsHandling :: m_errorInfo) > 0) {
вижу такую ошибку:
unresolved static variable 'ErrorsHandling::m_errorInfo' PositionHandling.mqh 102 40
С чего бы то вдруг к переменной m_errorInfo нет доступа?
В общем-то, я написал 2 свойста:
class ErrorsHandling { private: //---- public: static string m_errorInfo; // Переменная для сбора информации об ошибках static bool errorHandling(int errorNo, bool& isStopInvalid); static void reConnect(); static string errorToString(int errorNo); static string getErrorDescription(int errorNo); static string getErrorInfo(void); static void setErrorInfo(const string err); //---- Конструктор и деструктор ErrorsHandling(void); ~ErrorsHandling(void); }; //======================================================================================================================================== // Реализация свойств класса. ============================================================================================================ string ErrorsHandling :: getErrorInfo(void) { return (m_errorInfo); }; void setErrorInfo(const string err) { string m_errorInfo = err; }
В строке:
return (m_errorInfo);
ошибка:
unresolved static variable 'ErrorsHandling::m_errorInfo' ErrorsHandling.mqh 53 11
unresolved static variable 'm_errorInfo' ErrorsHandling.mqh 53 11
Так вот в строке:
вижу такую ошибку:
unresolved static variable 'ErrorsHandling::m_errorInfo' PositionHandling.mqh 102 40
С чего бы то вдруг к переменной m_errorInfo нет доступа?
if (StringLen (ErrorsHandling.m_errorInfo) > 0) { //... }
С чего бы то вдруг к переменной m_errorInfo нет доступа?
Не прописана, как GeneralData-переменные.
У меня и так переменная m_errorInfo доступна из всех мест, т.к. она паблик. Я же выше показал в коде.
В общем, я тут покрутил, повертел. Кое-что сдвинулось. Но вот остался момент интересный. Вот код:
Переменная m_errorInfo из класса ErrorsHandling почему-то не вызывается. Мне нужно нужно есс-но узнать, длина m_errorInfo больше нуля или нет. Компилятор ругается..
Так вот в строке:
вижу такую ошибку:
unresolved static variable 'ErrorsHandling::m_errorInfo' PositionHandling.mqh 102 40
С чего бы то вдруг к переменной m_errorInfo нет доступа?
На всякий случай - путаете переменную с указателем.
Не прописана, как GeneralData-переменные.
Да я уже это проверял. Это был первый вариант.
Этот код:
class ErrorsHandling { private: //---- public: static string m_errorInfo; // Переменная для сбора информации об ошибках static bool errorHandling(int errorNo, bool& isStopInvalid); static void reConnect(); static string errorToString(int errorNo); static string getErrorDescription(int errorNo); static string getErrorInfo(void); static void setErrorInfo(const string err); //---- Конструктор и деструктор ErrorsHandling(void); ~ErrorsHandling(void); }; //========================================================================================================================================= // Конструктор класса. ==================================================================================================================== ErrorsHandling :: ErrorsHandling(void) { } //========================================================================================================================================= // Деструктор класса. ===================================================================================================================== ErrorsHandling :: ~ErrorsHandling(void) { } //======================================================================================================================================== // Реализация свойств класса. ============================================================================================================ string ErrorsHandling :: getErrorInfo(void) { return (ErrorsHandling :: m_errorInfo); }; void setErrorInfo(const string err) { string m_errorInfo = err; }
Возвращает ту же ошибку при компиляции:
unresolved static variable 'ErrorsHandling::m_errorInfo' ErrorsHandling.mqh 53 29
Причём, на ту же строку:
return (string ErrorsHandling :: m_errorInfo);
string ErrorsHandling::m_errorInfo = NULL;
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пишу бибилотеки для написания совков. Появилась необходимость написать 2 статических класса. Статических классов как я понял не создашь, но классы со статическими методами и членами создать можно. Мне разницы нет и желания что-то выдумывать тоже нет, поэтому я решил написать так как понимаю опираясь на свой опыт в других языках.
С одним классом всё получилось удачно.
Вот сам класс и присвоение статическим переменным их значений:
В даном примере статическим переменным присваиваются значения в том же классе, членами которого они и являются. Здесь вопросов нет, вопрос решён.
Дальше я написал ещё несколько классов и наткнулся на грабли. Обычно, подобоные вопросы решаются легко, но мкл4 как-то с наскока на решилось.
В общем-то, есть класс ErrorsHandling, в котором есть статическая переменная:
Мне нужно иметь возможность переменной m_errorInfo задать значение из другого класса. Сеттер нормальный написать у меня вообще не получилось, поэтому этот вопрос я опускаю и забил. Но вот присвоить значение из другого класса, куда я уже импортировать тот класс ErrorsHandling не получается. Хотя пишу так же...
Это вообще возможно? Если такой возможность нет, тогда нет вообще смысла в статических переменным. Придётся объекты создавать, а это лишняя память и тд...