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

 

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

С одним классом всё получилось удачно.

Вот сам класс и присвоение статическим переменным их значений:

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);
};
//=========================================================================================================================================
// Инициализация статических членов класса. ===============================================================================================
  const string  GeneralData :: m_expertName = StringConcatenate(WindowExpertName(), ":  ", getNameTF(_Period), "_", _Symbol);
  const bool    GeneralData :: m_realTrade = (!IsTesting() && !IsOptimization());
  const bool    GeneralData :: m_virtualTrade = (IsOptimization() || (IsTesting() && !IsVisualMode()));

В даном примере статическим переменным присваиваются значения в том же классе, членами которого они и являются. Здесь вопросов нет, вопрос решён.

Дальше я написал ещё несколько классов и наткнулся на грабли. Обычно, подобоные вопросы решаются легко, но мкл4 как-то с наскока на решилось.

В общем-то, есть класс ErrorsHandling, в котором есть статическая переменная:

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);
    //---- Конструктор и деструктор
    ErrorsHandling(void);
   ~ErrorsHandling(void);
};

Мне нужно иметь возможность переменной m_errorInfo задать значение из другого класса. Сеттер нормальный написать у меня вообще не получилось, поэтому этот вопрос я опускаю и забил. Но вот присвоить значение из другого класса, куда я уже импортировать тот класс ErrorsHandling не получается. Хотя пишу так же...

Это вообще возможно? Если такой возможность нет, тогда нет вообще смысла в статических переменным. Придётся объекты создавать, а это лишняя память и тд...

 
hoz:

Пишу бибилотеки для написания совков.  Появилась необходимость написать 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 и делайте с ними что хотите, в рамках возможного.
 
Konstantin Nikitin:
Сделайте переменные которым вы собираетесь менять динамично значения 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

Такое ощущение, что мкл это вообще не позволяет. В общем, очень надеюсь, что кто-нить уже отлавливал этот костыль и подскажет как его обойти.
 
hoz:

Так вот в строке:

вижу такую ошибку:

unresolved static variable 'ErrorsHandling::m_errorInfo' PositionHandling.mqh 102 40

С чего бы то вдруг к переменной m_errorInfo нет доступа?

if (StringLen (ErrorsHandling.m_errorInfo) > 0) {
  //...
}
 
hoz:

С чего бы то вдруг к переменной m_errorInfo нет доступа?

Не прописана, как GeneralData-переменные.

 
hoz:

У меня и так переменная m_errorInfo доступна из всех мест, т.к. она паблик. Я же выше показал в коде.

В общем, я тут покрутил, повертел. Кое-что сдвинулось. Но вот остался момент интересный. Вот код:

Переменная m_errorInfo из класса ErrorsHandling почему-то не вызывается. Мне нужно нужно есс-но узнать, длина m_errorInfo больше нуля или нет. Компилятор ругается.. 

Так вот в строке:

вижу такую ошибку:

unresolved static variable 'ErrorsHandling::m_errorInfo' PositionHandling.mqh 102 40

С чего бы то вдруг к переменной m_errorInfo нет доступа?

 На всякий случай - путаете переменную с указателем. 

 
fxsaber:

Не прописана, как 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;