nkaretnikov:
День добрый!
Создаю свою коллекцию на основе класса CArrayObj
При компиляции получаю
'meID' - undeclared identifier CollectionTest.mq5 25 22
Понимаю, что при вызове lCollection.At(0).meID; я вытаскиваю CObject из коллекции, а в нем нет meID параметра.
Как сделать так, чтобы параметр оставался?
Какой тип значения возвращает метод At объекта lCollection?
Поле meID присутствует только у объекта CObjectToPronounce, который является наследником CObject, а метод коллекции возвращает именно базовый класс. Вам необходимо выполнить явное приведение типов прежде чем Вы обратитесь к полю полученного объекта.
Алексей Барбашин:
Какой тип значения возвращает метод At объекта lCollection?
Поле meID присутствует только у объекта CObjectToPronounce, который является наследником CObject, а метод коллекции возвращает именно базовый класс. Вам необходимо выполнить явное приведение типов прежде чем Вы обратитесь к полю полученного объекта.//+------------------------------------------------------------------+ //| CollectionTest.mq5 | //| Copyright 2020, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #include <Object.mqh> #include <Arrays\ArrayObj.mqh> //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- CSymbolToPronounce *lEUR = new CSymbolToPronounce; CCollectionOfObjectsToPronounce *lCollection = new CCollectionOfObjectsToPronounce; lEUR.init("EURUSD","Fiber"); string lSTR = lEUR.meID; lCollection.Add(lEUR); CSymbolToPronounce lAT; lAT = lCollection.At(0); lCollection.doSomethingWithCollection(); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CObjectToPronounce: public CObject { public: string meID; string meName; }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CSymbolToPronounce: public CObjectToPronounce { public: void init(string inSymbol, string inName); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CSymbolToPronounce::init(string inSymbol, string inName) { this.meID = inSymbol; this.meName = inName; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CCollectionOfObjectsToPronounce: public CArrayObj { public: void doSomethingWithCollection(); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CCollectionOfObjectsToPronounce::doSomethingWithCollection() { CSymbolToPronounce lSymbol; for(int i=0; i<m_data_total; i++) { lSymbol = this.At(i); printf(lSymbol.meID); } } //+------------------------------------------------------------------+
так?
nkaretnikov:
так?
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CCollectionOfObjectsToPronounce::doSomethingWithCollection() { CSymbolToPronounce lSymbol; for(int i=0; i<m_data_total; i++) { lSymbol = this.At(i); printf(lSymbol.meID); } }
Можно так:
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CCollectionOfObjectsToPronounce::doSomethingWithCollection() { for(int i=0; i<m_data_total; i++) { CSymbolToPronounce* lSymbol= this.At(i); printf(lSymbol.meID); } }
lCollection.At(0).meID;
Можно так:
dynamic_cast<CObjectToPronounce*>(lCollection.At(ind)).meID;
nkaretnikov:
так?
все оказалось очень просто
void CCollectionOfObjectsToPronounce::doSomethingWithCollection() { CSymbolToPronounce *lSymbol; for(int i=0; i<m_data_total; i++) { lSymbol = this.At(i); printf(lSymbol.meID); } }
получать надо указатель на объект, тогда и свойства дочернего класса становятся доступными

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
День добрый!
Создаю свою коллекцию на основе класса CArrayObj
При компиляции получаю
'meID' - undeclared identifier CollectionTest.mq5 25 22
Понимаю, что при вызове lCollection.At(0).meID; я вытаскиваю CObject из коллекции, а в нем нет meID параметра.
Как сделать так, чтобы параметр оставался?