Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
В сервисе Фриланс выполнено тысячи оплачиваемых заказов. Присоединяйся!
Владимир
266
Владимир 2016.03.16 18:28 
template<typename T>
class classListValue
{
private:
   // Массив элементов списка
   T              fItems[];
   int            fCount;
private:
   // Удаление элемента с индексом aIndex из списка
   void           MemoryMove(const int aIndex);
public:
   // очистить список
   void           Clear();
public:
   // Добавляем новый элемент в список и возвращаем его индекс в списке
   virtual int    Add(const T aValue);
public:
   // Удаляем элемент по индексу в списке
   bool           Delete(const int aIndex);
public:
   // Удаляем элемент из списка
   virtual bool   Remove(const T aValue);
public:
   // Поиск элемента в списке. -1 Не найден
   int            IndexOf(const T aValue);
public:
   // Количество элементов в списке
   int            Count(){return(fCount);};
public:
   // Извлечь элемент из списка по индексу aIndex
   T              GetItem(const int aIndex){return(fItems[aIndex]);};
   
   // Установить элемент aObject в списка по индексу aIndex
   void           SetItem(const int aIndex, T aValue){fItems[aIndex] = aValue;};
      
   T              operator[](const int aIndex){return(GetItem(aIndex));};
public:
   classListValue(void);
   
   ~classListValue(void);
};

template<typename T>
classListValue::classListValue(void)
{
   ArrayResize(fItems, 0);
   fCount = 0;
};
     

template<typename T>
classListValue::~classListValue(void)
{
   Clear();
   ArrayFree(fItems);
}

template<typename T>
void classListValue::Clear()
{
   for (int tmpI = (fCount-1); tmpI >= 0; tmpI--)
      Delete(tmpI);
      
   fCount = 0;
   ArrayResize(fItems, 0);
}
   
template<typename T>
int classListValue::Add(const T aValue)
{
   int tmpResult = fCount;
   
   if (tmpResult >= ArraySize(fItems))
   {
      ArrayResize(fItems, tmpResult + 100);
      fCount = tmpResult + 1;
   }
      
   fItems[tmpResult] = aValue;
   return(tmpResult);
}
   
template<typename T>
bool classListValue::Delete(const int aIndex)
{
   bool tmpResult = False;
   
   if (Count() > aIndex)
      tmpResult = Remove(fItems[aIndex]);
      
   return(tmpResult);
}

template<typename T>
void classListValue::MemoryMove(const int aIndex)
{
   int tmpCount = (fCount - 1);
   
   for (int tmpI = aIndex; (tmpI < tmpCount); tmpI++)
      fItems[tmpI] = fItems[tmpI + 1];
   
   fCount--;
}

template<typename T>
int classListValue::IndexOf(const T aValue)
{
   int tmpResult = -1;
   int tmpCount = Count();
   
   for (int tmpI = 0; tmpI < tmpCount; tmpI++)
      if (fItems[tmpI] == aValue)
      {
         tmpResult = tmpI;
         break;
      }
   
   return(tmpResult);
}

template<typename T>
bool classListValue::Remove(const T aValue)
{
   bool tmpResult = False;
   int tmpIndex = IndexOf(aValue);
   int tmpCount = Count();
   
   if (tmpIndex > -1)
   {
      MemoryMove(tmpIndex);         
      tmpResult = True;
   }     
   
   return(tmpResult);

}

 

 

Наследую его и делаю возможность передавать reference

 

template<typename T>

class classListReference : public classListValue<T*>

{

private:

   // признак того что являемся ли мы владельцами элементов списка

   bool                 fOwnersObjects;

public:

   // Удаляем класс из списка

   virtual bool   Remove(const T aValue);

public:

   classListReference(void){fOwnersObjects = True;};

   classListReference(bool aOwnersObjects){fOwnersObjects = aOwnersObjects;};

   ~classListReference(void);

};


template<typename T>

bool classListReference::Remove(const T aValue)

{

   bool tmpResult = classListValue::Remove(aValue);

   

   if (fOwnersObjects)

      if (CheckPointer(aValue) != POINTER_INVALID)

         if (CheckPointer(aValue) == POINTER_DYNAMIC)

            delete aValue;

         

   return(tmpResult);

}


Класс  который использует classListReference

 class classObject

{

private:

   // Список классов которые заявились о то что хотят знать что мы удаляемся

   classListReference<classObject> *fListNotification;

public:   

   // Событие возникающее когда класс aWho уничтожается

   virtual void Notification(classObject *aWho)

   {

      fListNotification.Remove(aWho);

   };

public:

   // метод реализующий, то что класс aWhom хочет быть информирован когда мы будет удаляться

   virtual void FreeNotification(classObject *aWhom){fListNotification.Add(aWhom);};

public:

   classObject(void){fListNotification = new classListPointer<classObject>(False);};

   ~classObject(void);

};


classObject::~classObject(void)

{   

   

   delete fListNotification;

}

 

И получаю вот такую ошибку! Не могу понять как её обойти! 

 Ошибка компиляции

Ihor Herasko
8462
Ihor Herasko 2016.03.16 21:04  

Объект передается только по ссылке:

virtual bool Remove(const T &aValue);
Владимир
266
Владимир 2016.03.17 07:43  

Побывал так!

выдается тогда ошибка что такого метода нет в базовом классе

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