Hej,
Nie jestem programistą c++ dlatego bardzo liczę na Waszą pomoc.
Mam stworzyć klasę która ma działać jako "double linked ring", i klasa ta ma być oparta na szablonach (template). Jest zdefiniowana tak:
template <typename T>
class DLRing{
};
czyli jest to lista, która przechowuje dowolnej klasy parametry. Chciałam żeby ta klasa miała metodę sortuj. I teraz chciałabym zostawić użytkownikowi, który teoretycznie będzie korzystał z tej metody czy ma być to sortowanie w kierunku malejącym, czy rosnącym czy jakim sobie wymyśli. Dlatego funkcja sortuj przyjmuje jako parametr stworzoną przeze mnie klasę Comparator
void sort(Comparator<T> c);
Chciałabym żeby klasa Comparator była tylko interfejsem, żeby nie można było stworzyć egzemplarza tej klasy, a tylko klasy po niej dziedziczące implementowały
odpowiednie metodę, która jest używana w funkcji sort. Chciałam skorzystać z poliformizmu - żeby wywoływana była metoda z "klasy dziecka" Dlatego napisałam takie 2 klasy:
template <typename T>
class Comparator{
public :
int virtual compare(T data1, T data2)=0;
};
template <typename T>
class AscendingOrderComparator : public Comparator<T>{
public :
int compare(T data1, T data2){
if(data1< data2)
return -1;
if(data1>data2)
return 1;
return 0;
}
};
Wyczytałam że metoda virtualna, powoduje że klasa jest abstrakcyjna. Wywołuję to w ten sposób:
DLRing<int> ring;
cout<<"Dodajemy\n";
ring.addAtEnd(2);
ring.addAtEnd(1);
ring.print();
AscendingOrderComparator<int> comparator;
ring.sort(comparator);
ring.print();
Niestety kodu w obecnej postaci nie da się skompilować - jest wyrzucany błąd:
// cannot allocate an object of type `Comparator<int>' because the following virtual functions are abstract: Comparator<T>::compare(T, T) [with T = int]
//
Jeśli w klasie Comparator dodam ciało funkcji (dalej zostawiając ją wirtualną) i to program się uruchamia, ale sortuje według funkcji z klasy Comparator, a nie dziedziczącej po niej AscendingOrderComparator, mimo że obiekt klasy AscendingOrderComparator jest w wywołaniu przekazywany do funkcji sort.
Bardzo liczę na Waszą pomoc