Как разово инициализировать член класса не через конструктор?

 

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

const string m_expertName

Т.к. вызваться логирование будет из разных мест, то через конструктор задавать значение для m_expertName не выйдет, т.к., __FILE__ возвращает имя именно текущего компилируемого файла. Соответственно, в каком файле будет создавать экземпляр класса логирования, то в то имя того файла и можно будет передать  в класс логирования. А это не вариант.

Изначально, у меня были мысли, что бы как-то сделать всё-таки m_expertName статичным, но тогда его нужно инициализировать на глобальном уровне. Это не вариант, т.к. в классе логирования имени эксперта нет. Дальше я подумал что пусть m_expertName будет не статичным, но константным. Но здесь тоже пападалово:

// ===============================================================================  Input переменные  =============================================================================+
input string _Logging                  =   " ____________________ Логирование ____________________ ";
input bool    i_needLogging = true,     // Флаг необходимости вывода лога в журнал и( или ) на экран терминала
              i_needPrinting = true,    // Флаг печати комментариев
              i_needComment = true;     // Флаг показа комментариев на графике

//+================================================================================================================================================================================+
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//|                                                            КЛАСС ДЛЯ ЛОГИРОВАНИЯ, А ТАКЖЕ ВЫВОДА ИНФОРМАЦИИ В ЖУРНАЛ                                                           |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+================================================================================================================================================================================+
class Logging {
  private:
    const string m_expertName;
  public:
    //---- Конструктор и деструктор
    Logging();
   ~Logging();
    //---- Сеттеры и геттеры
    void setExpertName(string expertName) const;
};
//==================================================================================================================================================================================
// Конструктор класса. =============================================================================================================================================================
Logging :: Logging() {
  //---
}
//==================================================================================================================================================================================
// Деструктор класса. ==============================================================================================================================================================
Logging :: ~Logging() {
  //---
}

void Logging :: setExpertName(string expertName) const {
//const bool Logging :: m_needLogging = i_needLogging;
  m_expertName = expertName;
}

На последней:

m_expertName = expertName;

строке ошибка при компиляции эксперта:

'm_expertName' - member of the constant object cannot be modified Logging.mqh 44 3

А как тогда всё-таки передать в этом класс 1 раз имя эксперта и больше его не передавать? Ведь имя эксперта это фиксированная константа. Нет резона постоянно в каждом классе заводить параметр типа string с именем expertName и передавать его везде. Как по мне это не изящное и далеко не оптимальное решение...

 
hoz:

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

Т.к. вызваться логирование будет из разных мест, то через конструктор задавать значение для m_expertName не выйдет, т.к., __FILE__ возвращает имя именно текущего компилируемого файла. Соответственно, в каком файле будет создавать экземпляр класса логирования, то в то имя того файла и можно будет передать  в класс логирования. А это не вариант.

Изначально, у меня были мысли, что бы как-то сделать всё-таки m_expertName статичным, но тогда его нужно инициализировать на глобальном уровне. Это не вариант, т.к. в классе логирования имени эксперта нет. Дальше я подумал что пусть m_expertName будет не статичным, но константным. Но здесь тоже пападалово:

На последней:

строке ошибка при компиляции эксперта:

А как тогда всё-таки передать в этом класс 1 раз имя эксперта и больше его не передавать? Ведь имя эксперта это фиксированная константа. Нет резона постоянно в каждом классе заводить параметр типа string с именем expertName и передавать его везде. Как по мне это не изящное и далеко не оптимальное решение...

MQLInfoString(MQL_PROGRAM_NAME) чем не катит ?
 
Maxim Kuznetsov:
MQLInfoString(MQL_PROGRAM_NAME) чем не катит ?

Огромная благодарность)) Продолбался час. А оказалось что всё проще..)) И класс не нужен. Таким образом можно это всё библиотекой реализовать со всеми её приемуществами.

Причина обращения: