Как присвоить значение статической переменной из другого класса? - страница 2

 
fxsaber:

Сеттер у меня работает, я о геттере спрашиваю..

 
hoz:

Сеттер у меня работает, я о геттере спрашиваю..

Весь код один раз покажите.

 
fxsaber:

Весь код один раз покажите.

Вот интересующий момент. Дальше уже идут расшифровки ошибок:

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 *errorHandling;
//=========================================================================================================================================
// Конструктор класса. ====================================================================================================================
ErrorsHandling :: ErrorsHandling(void) {
}
//=========================================================================================================================================
// Деструктор класса. =====================================================================================================================
ErrorsHandling :: ~ErrorsHandling(void) {
}
//========================================================================================================================================
// Реализация свойств класса. ============================================================================================================
string ErrorsHandling :: getErrorInfo(void) {
  return (ErrorHandling.m_errorInfo);
};

void setErrorInfo(const string err) {
  string m_errorInfo = err;
}

Касяк в методе:

string ErrorsHandling :: getErrorInfo(void) {
  return (ErrorHandling.m_errorInfo);
};

Строка:

return (ErrorHandling.m_errorInfo);

Ошибка:

'ErrorHandling' - undeclared identifier ErrorsHandling.mqh 53 11

'm_errorInfo' - struct or class type expected ErrorsHandling.mqh 53 25

implicit conversion from 'number' to 'string' ErrorsHandling.mqh 53 25

 
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::m_errorInfo = NULL;

ErrorsHandling *errorHandling;
//=========================================================================================================================================
// Конструктор класса. ====================================================================================================================
ErrorsHandling :: ErrorsHandling(void) {
}
//=========================================================================================================================================
// Деструктор класса. =====================================================================================================================
ErrorsHandling :: ~ErrorsHandling(void) {
}
//========================================================================================================================================
// Реализация свойств класса. ============================================================================================================
string ErrorsHandling :: getErrorInfo(void) {
  return (ErrorsHandling::m_errorInfo);
};

void setErrorInfo(const string err) {
  ErrorsHandling::m_errorInfo = err;
}
 
fxsaber:

Не компилируется всё-равно:

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 *errorHandling = NULL;
//=========================================================================================================================================
// Конструктор класса. ====================================================================================================================
ErrorsHandling :: ErrorsHandling(void) {
}
//=========================================================================================================================================
// Деструктор класса. =====================================================================================================================
ErrorsHandling :: ~ErrorsHandling(void) {
}
//========================================================================================================================================
// Реализация свойств класса. ============================================================================================================
string ErrorsHandling :: getErrorInfo(void) {
  return (ErrorHandling :: m_errorInfo);
};

void setErrorInfo(const string err) {
  ErrorsHandling :: m_errorInfo = err;
}

И для чего нам нужен указатель errorHandling ? Он же не применяется у вас..

 
hoz:

Не компилируется всё-равно:


 
На скрине вижу mq5, а у меня mql4. Может в этот загвоздка?
 
hoz:
На скрине вижу mq5, а у меня mql4. Может в этот загвоздка?

Загвоздка в неправильной копи-пасте.

 

Хотел что-то умное сказать, но после fxsaber'a - говорить просто нечего, все верно указано.

Разве что добавить, что изначально я задаю всем переменным некорректные значения, чтобы не допустить использования неинициализированных переменных:

 static string ErrorsHandling ::m_errorInfo = "Неизвестная ошибка"; // Не NULL

Статическими константами - членами классов я пользуюсь очень широко, есть у меня и несколько статических переменных - членов классов. Никогда никаких проблем не было - доступ всегда есть. Весь код кроссплатформенный, работает как в MT4, так и в МТ5

 
George Merts:

Хотел что-то умное сказать, но после fxsaber'a - говорить просто нечего, все верно указано.

Разве что добавить, что изначально я задаю всем переменным некорректные значения, чтобы не допустить использования неинициализированных переменных:

 static string ErrorsHandling ::m_errorInfo = "Неизвестная ошибка"; // Не NULL

Статическими константами - членами классов я пользуюсь очень широко, есть у меня и несколько статических переменных - членов классов. Никогда никаких проблем не было - доступ всегда есть. Весь код кроссплатформенный, работает как в MT4, так и в МТ5

Согласен. Так будет правильнее. Но это уже зависит от того, как класс написан.

В общем-то, я с утра всё проверил. Уже компилируется. Вот то что сейчас есть (класс и сеттеры):

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 :: m_errorInfo = "";
ErrorsHandling *errorsHandling;
//=========================================================================================================================================
// Конструктор класса. ====================================================================================================================
ErrorsHandling :: ErrorsHandling(void) {
}
//=========================================================================================================================================
// Деструктор класса. =====================================================================================================================
ErrorsHandling :: ~ErrorsHandling(void) {
}
//========================================================================================================================================
// Реализация свойств класса. ============================================================================================================
string ErrorsHandling :: getErrorInfo(void) {
  return (ErrorsHandling :: m_errorInfo);
};

void setErrorInfo(const string err) {
  ErrorsHandling :: m_errorInfo = err;
}

Во-первых, зачем нам в данном случае нужен указатель?

ErrorsHandling *errorsHandling;

Решил проверить как получать и возвращать значения в эту переменой. Вот 2 варианта проверенных мной:

1) В методе OnTick() эксперта написал так:

ErrorsHandling :: m_errorInfo = "№ Касяка";
printf("ErrorsHandling :: m_errorInfo = ", ErrorsHandling :: m_errorInfo);
ErrorsHandling :: m_errorInfo = "";
printf("ErrorsHandling :: m_errorInfo = ", ErrorsHandling :: m_errorInfo);

Кидаю эксперт на график и вижу:

2018.02.20 14:15:37.399 onMA GBPUSD,M1: ErrorsHandling :: m_errorInfo = 

2018.02.20 14:15:37.399 onMA GBPUSD,M1: ErrorsHandling :: m_errorInfo = 

Делаю вывод, что переменная не принимает значение, хотя и ошибок нет никаких в плане доступа к переменной m_errorInfo. Что не так?

2) В методе OnTick() эксперта написал так:

        errorsHandling.m_errorInfo = "№ Касяка";
        printf("errorsHandling.m_errorInfo = ", errorsHandling.m_errorInfo);
        errorsHandling.m_errorInfo = "";
        printf("errorsHandling.m_errorInfo = ", errorsHandling.m_errorInfo);

Кидаю эксперт на график и вижу:

2018.02.20 14:29:20.058 onMA GBPUSD,M1: errorsHandling.m_errorInfo = 

2018.02.20 14:29:20.058 onMA GBPUSD,M1: errorsHandling.m_errorInfo = 

Делаю вывод, что переменная не принимает значение, хотя и ошибок нет никаких в плане доступа к переменной m_errorInfo. Что не так?