Вопрос по ООП

 

День добрый!

Создаю свою коллекцию на основе класса CArrayObj

//+------------------------------------------------------------------+
//|                                               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;
   CSymbolToPronounce                *lBTC;
   CCollectionOfObjectsToPronounce   *lCollection;
   
   lEUR.init("EURUSD","Fiber");
   printf(lEUR.meID);
   lCollection.Add(lEUR);
   lCollection.At(0).meID;
   
   
  }
//+------------------------------------------------------------------+



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
  {
  };




При компиляции получаю 

'meID' - undeclared identifier CollectionTest.mq5 25 22

Понимаю, что при  вызове lCollection.At(0).meID;  я вытаскиваю CObject из коллекции, а в нем нет meID параметра.

Как сделать так, чтобы параметр оставался?


 
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);
     }
  }

получать надо указатель на объект, тогда и свойства дочернего класса становятся доступными

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