Нужна помощь с шаблонами функций Новый комментарий Владимир 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 2016.03.16 21:04 #1 Объект передается только по ссылке:virtual bool Remove(const T &aValue); Владимир 2016.03.17 07:43 #2 Побывал так!выдается тогда ошибка что такого метода нет в базовом классе Новый комментарий
}
Наследую его и делаю возможность передавать 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;
}
И получаю вот такую ошибку! Не могу понять как её обойти!