Доступ из вложенного класса к полям внешнего или соседнего класса.

 

Собственно сабж. Как?

На шарпе я передаю в конструкторе ссылку на внешний класс и по ней имею доступ ко всем полям. А тут что-то не получается.

 

Попробую объяснить подробней.

Вот есть два класса, в иерархии один вложен в другом.

Верхний класс - содержит информацию о конкретном инструменте, общие  методы для него и тд.

Вложенный класс - содержит инфу о позиции по этому инструменту и локальные методы, которые используют данные из класса  верхнего уровня. Например поле 'Name'.

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

в VС# я просто передаю ссылку (this) на него при объявлении, через конструктор и по ней могу обратиться к любому полю. Как это правильно сделать на MQL5?

Ветки по ООП читал. Но не получается сделать это через конструктор. Че-то запутался совсем с этими указателями.  Дайте пожалуйста  пример, у кого тут 'соль в тыкве')) Желательно через конструктор.

Может есть более простой способ. 

//+------------------------------------------------------------------+
   class CInclude //вложенный класс
     {
   public:
                        CInclude(void){};
                       ~CInclude(void){};
                        //CTop top;//ссылка на верхний уровень
                        void PrintTopName(void){Print( top.Name  );};//тут, во вложенном классе нужен доступ к классу на уровень выше(top.Name и т.д.)
    };
//+------------------------------------------------------------------+
class CTop        //верхний класс
  {
public:
          string Name;
          string Board;
          string ParameterNNN;
          CTop(void){Name="Top";  Print( " CTop: Name=" +Name  ); };
         ~CTop(void){             Print( "~CTop: Name=" +Name  ); };
      CInclude Inc;//тут вложили класс
 };
//+------------------------------------------------------------------+
 CTop Top;
//+------------------------------------------------------------------+
//| "OnInit" event handler function                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   EventSetTimer(5);
   Top.Name = "OnInit";
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   Top.Inc.PrintTopName();//
  }
//+------------------------------------------------------------------+
 

Что, никто не подскажет?

Ап 

 
void PrintTopName(void){Print( top.Name  );}

Замените отношения с "включения" на "является". В Вашем примере top - некий класс CTop который включен в класс CInclude. При этом CInclude является CTop. Возникает полная путаница. Вместо того, что бы писать top.Name пишите просто Name(), т.к. CInlude это и есть CTop со всеми его разрешенными методами и полями.

//Теперь это действительно верхний, или базовый класс.
class CTop        //верхний класс
  {
public:
   string Name(){return name;}
   void Name(string n){name = n;}
   string            Board;
   string            ParameterNNN;
                     CTop(void){name="Top";  Print( " CTop: Name=" +name  ); };
                    ~CTop(void){             Print( "~CTop: Name=" +name  ); };
private:
   string            name;
  };
  
//Теперь это ПРОИЗВОДНЫЙ класс.
class CInclude : public CTop
  {
public:
   CInclude(void){};
   ~CInclude(void){};
   
   void PrintTopName(void)
     {
      Print(Name());
     }
  };
//+------------------------------------------------------------------+
CInclude Top;
//+------------------------------------------------------------------+
//| "OnInit" event handler function                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   EventSetTimer(5);
   Top.Name("OnInit");
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   Top.PrintTopName();//
  }
//+------------------------------------------------------------------+
 

Примерно так:

class CTop        //верхний класс
{
   class CInclude //вложенный класс
   {
      CTop* top; //указатель на верхний уровень
      
   public:
      CInclude( CTop& _top ) : top( GetPointer(_top) ){}
      ~CInclude(){};

      void PrintTopName(void)
      {
         Print( top.Name  ); //тут, во вложенном классе нужен доступ к классу на уровень выше(top.Name и т.д.)
      }
   };

public:
   string Name;
   string Board;
   string ParameterNNN;

   CTop() : Inc(this)
   {
      Name="Top";
      Print( " CTop: Name=" +Name  );
   }

   ~CTop()
   {
      Print( "~CTop: Name=" +Name  );
   }
   
   CInclude Inc; //тут вложили класс
};
 

Так. Что-то начало проявляться. Спасибо.  ++ после шарпа это пипец!..

1. Скажите, а как понимать такой синтаксис конструкторов с двоеточием? Выглядит как наследование конкретного экземпляра. У меня бред ))

2. Чем отличается ссылка от указателя? (& vs *)

 
pronych:

1. Скажите, а как понимать такой синтаксис конструкторов с двоеточием? Выглядит как наследование конкретного экземпляра. У меня бред ))

googl

2. Чем отличается ссылка от указателя? (& vs *)

googl


лень ?

Google
Google
  • www.google.ru
Поиск информации в интернете: веб страницы, картинки, видео и многое другое.
 

Я спросил про синтаксис MQL на сайте MQL. Гугл лучше знает?

 
Всё понял спасибо
 
pronych:

Собственно сабж. Как?

На шарпе я передаю в конструкторе ссылку на внешний класс и по ней имею доступ ко всем полям. А тут что-то не получается.

Вы бы просто привели свой пример, чтобы понять, что именно не получается.

Вы сказали, что хотите получить доступ во внешний класс. То есть в класс наследника? Вы нарушаете принцип наследования (наследники всё знают о своих родителях, так как являются надмножеством, родители знают о своих наследниках только в пределах своей функциональности, они не могут выйти за пределы своего множества), а говорите, что прочитали всё ООП

1. Почему бы Вам не применить инкапсуляцию? То есть, объект одного класса является членом другого класса безо всякого наследования.

2. Почему Вам необходимо передавать пойнтер именно в конструкторе? Отдельный метод сделать не судьба?

3. Налицо ошибки проектирования.

 
stringo:

Вы бы просто привели свой пример, чтобы понять, что именно не получается.

Вы сказали, что хотите получить доступ во внешний класс. То есть в класс наследника? Вы нарушаете принцип наследования (наследники всё знают о своих родителях, так как являются надмножеством, родители знают о своих наследниках только в пределах своей функциональности, они не могут выйти за пределы своего множества), а говорите, что прочитали всё ООП

1. Почему бы Вам не применить инкапсуляцию? То есть, объект одного класса является членом другого класса безо всякого наследования.

2. Почему Вам необходимо передавать пойнтер именно в конструкторе? Отдельный метод сделать не судьба?

3. Налицо ошибки проектирования.

Во-во, топикстартер не понимает, что в реальности ему не нужен доступ к внешнему классу. В реальности ему нужен производный класс с включенной функциональностью базового, что решается классическим наследованием.

pronych:

Так. Что-то начало проявляться. Спасибо.  ++ после шарпа это пипец!..

Вы конечно извините, но после шарпа задавать такие вопросы мягко говоря странно. Если Вы реально знаете шарп, то Вы как бы автоматически знаете о понятиях указателей, наследовании, и вообще о принципах ООП. 
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Наследование
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Наследование
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Наследование - Документация по MQL5