Попробую объяснить подробней.
Вот есть два класса, в иерархии один вложен в другом.
Верхний класс - содержит информацию о конкретном инструменте, общие методы для него и тд.
Вложенный класс - содержит инфу о позиции по этому инструменту и локальные методы, которые используют данные из класса верхнего уровня. Например поле '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 *)
1. Скажите, а как понимать такой синтаксис конструкторов с двоеточием? Выглядит как наследование конкретного экземпляра. У меня бред ))
2. Чем отличается ссылка от указателя? (& vs *)
лень ?
Я спросил про синтаксис MQL на сайте MQL. Гугл лучше знает?
Собственно сабж. Как?
На шарпе я передаю в конструкторе ссылку на внешний класс и по ней имею доступ ко всем полям. А тут что-то не получается.
Вы бы просто привели свой пример, чтобы понять, что именно не получается.
Вы сказали, что хотите получить доступ во внешний класс. То есть в класс наследника? Вы нарушаете принцип наследования (наследники всё знают о своих родителях, так как являются надмножеством, родители знают о своих наследниках только в пределах своей функциональности, они не могут выйти за пределы своего множества), а говорите, что прочитали всё ООП
1. Почему бы Вам не применить инкапсуляцию? То есть, объект одного класса является членом другого класса безо всякого наследования.
2. Почему Вам необходимо передавать пойнтер именно в конструкторе? Отдельный метод сделать не судьба?
3. Налицо ошибки проектирования.
Вы бы просто привели свой пример, чтобы понять, что именно не получается.
Вы сказали, что хотите получить доступ во внешний класс. То есть в класс наследника? Вы нарушаете принцип наследования (наследники всё знают о своих родителях, так как являются надмножеством, родители знают о своих наследниках только в пределах своей функциональности, они не могут выйти за пределы своего множества), а говорите, что прочитали всё ООП
1. Почему бы Вам не применить инкапсуляцию? То есть, объект одного класса является членом другого класса безо всякого наследования.
2. Почему Вам необходимо передавать пойнтер именно в конструкторе? Отдельный метод сделать не судьба?
3. Налицо ошибки проектирования.
Во-во, топикстартер не понимает, что в реальности ему не нужен доступ к внешнему классу. В реальности ему нужен производный класс с включенной функциональностью базового, что решается классическим наследованием.
Так. Что-то начало проявляться. Спасибо. ++ после шарпа это пипец!..
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Собственно сабж. Как?
На шарпе я передаю в конструкторе ссылку на внешний класс и по ней имею доступ ко всем полям. А тут что-то не получается.