вижу пару проблем:
Во-первых, ваша MemberInfo::CompareByTime()
функция написана неправильно. То, как вы это написали, отбрасывает любую проверку типов, которую может выполнить компилятор. Лучше было бы:
int MemberInfo::CompareByTime(const MemberInfo& mi1, const MemberInfo& mi2)
{
if(mi1.m_Time > mi2.m_Time)
return 1;
if(mi1.m_Time < mi2.m_Time)
return -1;
return 0;
}
Во-вторых, передайте функцию сравнения в связанный список в качестве параметра шаблона:
template <class T, int (*CompFcn)(const T&, const T&)>
class LinkedList: public ILinkedList
В-третьих, нет причин скрывать конструктор и заключать его в статическую функцию, которая возвращает указатель суперкласса. C ++ будет автоматически преобразовывать указатель объекта в указатель на его суперкласс при необходимости. Кроме того, вы должны передавать содержащиеся значения по ссылке (вместо указателя) и сохранять их по значению, когда это возможно; если вы хотите, чтобы ваш контейнер сохранял указатели, просто установите T
в тип указателя. Таким образом, ваша конструкция упрощается до:
protected:
T m_ptValue;
public:
LinkedList(const T& ptVal);
Наконец, ваш код для MemberData::CreateLinkedList
не работает. Всегда возвращает NULL
. То есть снаружи он выглядит так, как будто никогда не создает связанный список. Кроме того, this->
ничего не делает. То, что вы должны иметь, это:
LinkedList<MemberInfo*, MemberInfo::CompareByTime>* MemberData::CreateLinkedList()
{
return new LinkedList<MemberInfo*, MemberInfo::CompareByTime>(get(FIRST));
}
Хотя, вероятно, хорошей практикой является определение typedef LinkedList<MemberInfo*, MemberInfo::CompareByTime> LinkedListType;
в MemberData
, что позволяет нам писать:
MemberData::LinkedListType* MemberData::CreateLinkedList()
{
return new LinkedListType(get(FIRST));
}
Обратите внимание, что возвращаемое значение будет автоматически преобразовано в ILinkedList*
, где это необходимо.