Скачать MetaTrader 5

Как прилепить внешние переменные к классу?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
hoz
1936
hoz  

 Есть класс.  В нём используются внешние переменные. Как следует задавать значения этим переменным? Ведь в самом классе можно только объявлять переменные. А задавать значения не допустимо. Получается, что в объявлении класса это реализовать нельзя. Какие есть варианты решения данной ситуации?

 Я написал так в тестовом небольшом классе: (До класса объявил внешними переменными ib_PrintPermission и ib_CommentPermission

//+=======================================================================================================================================+
//                                                          ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ                                                         |
//+=======================================================================================================================================+
extern bool ib_PrintPermission = true,      // Флаг печати комментариев
            ib_CommentPermission = true;    // Флаг показа комментариев на графике
//+=======================================================================================================================================+
//===================================================   Определяем класс библиотеки   ====================================================|
//+=======================================================================================================================================+
class CLogging
{
   protected:
      string m_ls_LibName;
   public:
           CLogging();
          ~CLogging();
      void fWrite_Log (string fs_Txt, bool fb_PrintPermission, bool fb_CommentPermission);   // 1.1 Пишим Log-файл.

//.. тут...
//.. другие...
//.. методы...
     void fPrint (string fs_Txt, bool fb_PrintPermission, bool fb_CommentPermission);       // 1.2 Выводим на печать и (или) на график комментарии.
};
//+---------------------------------------------------------------------------------------------------------------------------------------+
//----
//=========================================================================================================================================
// 0.1 Конструктор класса. ================================================================================================================
CLogging::CLogging() {
}
// 0.2 Деструктор класса. =================================================================================================================
CLogging::~CLogging() {
}
//=========================================================================================================================================
// 1.1 Пишим Log-файл. ====================================================================================================================
void fWrite_Log (string fs_Txt, bool fb_PrintPermission, bool fb_CommentPermission);
..

...
Дальше объявления и описания методов класса...

Но, по-моему, так не очень грамотно. Или нормально? Какие ещё бывают варианты? 

Vadim Zhunko
5226
Vadim Zhunko  

В секцию protected или private их.

Сделать методы "Set...()" и "Get...()". Хотя что-то там уже есть.

hoz
1936
hoz  
Zhunko:

Сделать методы "Set...()" и "Get...()". Хотя что-то там уже есть.  


 И что дальше? Внутри данных методов инициализировать объявленные переменные заданным значение? Если внутри метода класса будут вводные члены это нормально?

 

Zhunko:

В секцию protected или private их.  


Меня одно удивляет. Ведь закрытые и защищённые секции класса не видны другим функциям. Как там вводные переменные то будут уместны, если их за пределами класса не видно?
Алексей Тарабанов
7326
Алексей Тарабанов  
hoz:


И что дальше? Внутри данных методов инициализировать объявленные переменные заданным значение? Если внутри метода класса будут вводные члены это нормально?


Меня одно удивляет. Ведь закрытые и защищённые секции класса не видны другим функциям. Как там вводные переменные то будут уместны, если их за пределами класса не видно?

Если я невидим, то не обязательно слеп.
Vadim Zhunko
5226
Vadim Zhunko  
hoz:
Меня одно удивляет. Ведь закрытые и защищённые секции класса не видны другим функциям. Как там вводные переменные то будут уместны, если их за пределами класса не видно?

Zhunko:

Сделать методы "Set...()" и "Get...()". Хотя что-то там уже есть.

hoz
1936
hoz  
Zhunko:
Сделать методы "Set...()" и "Get...()". Хотя что-то там уже есть.

 И что будет в данных методах? Имею ввиду, в Set() и Get()...

Я вижу это типа так:

//+=======================================================================================================================================+
//                                                          ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ                                                         |
//+=======================================================================================================================================+
extern bool ib_PrintPermission = true,      // Флаг печати комментариев
            ib_CommentPermission = true;    // Флаг показа комментариев на графике
//+=======================================================================================================================================+
//===================================================   Определяем класс библиотеки   ====================================================|
//+=======================================================================================================================================+
class CLogging
{
    private:
       void GetInputVarPrivate();                                                            // Переменные, которые не видны за пределами класса
    protected:
      string m_ls_LibName;
    public:
           CLogging();
          ~CLogging();
      void GetInputVarPublic();                                                              // Переменные, которые будут видны всем функциям, использующих класс
      void fWrite_Log (string fs_Txt, bool fb_PrintPermission, bool fb_CommentPermission);   // 1.1 Пишим Log-файл.

//.. тут...
//.. другие...
//.. методы...
     void fPrint (string fs_Txt, bool fb_PrintPermission, bool fb_CommentPermission);       // 1.2 Выводим на печать и (или) на график комментарии.
};
//+---------------------------------------------------------------------------------------------------------------------------------------+
//----
//=========================================================================================================================================
// 0.1 Конструктор класса. ================================================================================================================
CLogging::CLogging() {
}
// 0.2 Деструктор класса. =================================================================================================================
CLogging::~CLogging() {
}
//=========================================================================================================================================
void GetInputVarPrivate() {
extern VAR1 = x;
extern VAR2 = y;
...
...
extern VAR3 = z;
}

void GetInputVarPublic() {
extern VAR4 = x;
extern VAR5 = y;
...
...
extern VAR6 = z;
}
Vadim Zhunko
5226
Vadim Zhunko  
class A
 {
  int v;
  public:

  A(const int var = 0)
   {
    Set(var);
   }

  ~A(){}

  void Set(const int var)
   {
    v = var;
   }

  int Get() const
   {
    return(v);
   }
 };

A a;
a.Set(123);
int nVar = a.Get();
hoz
1936
hoz  
Zhunko:


Всё то конечно логично, но почему в объявлении метода:

int Get() const

спецификатор доступа находится после имени метода я так и не понял. Обычно же порядок такой:

тип спецификатор(если есть) имя переменной(или метода) 

Vadim Zhunko
5226
Vadim Zhunko  
hoz:


Всё то конечно логично, но почему в объявлении метода:

спецификатор доступа находится после имени метода я так и не понял. Обычно же порядок такой:

тип спецификатор(если есть) имя переменной(или метода)

Это означает, что метод не может модифицировать данные класса. Типа, на всякий случай, чтобы ничего плохого не случилось потом.
hoz
1936
hoz  
Zhunko:
Это означает, что метод не может модифицировать данные класса. Типа, на всякий случай, чтобы ничего плохого не случилось потом.


И каким же образом в функции:

 void Set(const int var)
   {
    v = var;
   }
Может измениться константа var, если она не получает никаких значений?
Vadim Zhunko
5226
Vadim Zhunko  
hoz:


И каким же образом в функции:

Может измениться константа var, если она не получает никаких значений?
Zhunko:
Это означает, что метод не может модифицировать данные класса. Типа, на всякий случай, чтобы ничего плохого не случилось потом.

Ещё не надо путать данные класса и параметр метода.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий