我試圖建立一個自定義列表實現(用於練習目的)。目前我已經用遊標創建了一個實現,而通常用指針創建了一個實現(循環雙向鏈表)。我不想創建不同的泛型函數(打印列表,自然合併排序等),其中唯一的區別是所用的類)。所以我創建了一個具有純虛擬方法的抽象類,將其用作接口。我使用條件編譯來處理位置類型的不同實現(遊標實現中的int和循環雙向鏈表中的節點的指針)。但我有這些錯誤:C + +重寫錯誤與抽象模板類
overriding 'Cella<T>* Lista<T>::primoLista() const [with T = char; Lista<T>::posizione = Cella<char>*]'
overriding 'Cella<T>* Lista<T>::primoLista() const [with T = char*; Lista<T>::posizione = Cella<char*>*]'
overriding 'Cella<T>* Lista<T>::primoLista() const [with T = float; Lista<T>::posizione = Cella<float>*]'
overriding 'Cella<T>* Lista<T>::primoLista() const [with T = int; Lista<T>::posizione = Cella<int>*]'
我會寫主要文件。
Lista.h
#ifdef USE_CURSOR
#include "Cella.h"
#else
#include "cellalp.h"
#endif
template <class T> class Lista
{
public:
#ifdef USE_CURSOR
typedef int posizione;
#else
typedef Cella<T>* posizione;
#endif
virtual void insLista(T elem, posizione p) = 0;
virtual void cancLista(posizione p) = 0;
virtual bool listaVuota() const = 0;
virtual T leggiLista(posizione p) const = 0;
virtual void scriviLista(T elem, posizione p) = 0;
virtual posizione primoLista() const = 0;
virtual bool fineLista(posizione p) const = 0;
virtual posizione succLista(posizione p) const = 0;
//virtual posizione predLista(posizione p) const = 0;
};
cellalp.h
template <class T> class Cella
{
public:
typedef T tipoelem;
Cella();
Cella(tipoelem);
void setElemento(tipoelem);
tipoelem getElemento() const;
void setSucc(Cella*);
Cella* getSucc() const;
void setPrec(Cella*);
Cella* getPrec() const;
bool operator ==(Cella);
private:
tipoelem elemento;
Cella* prec;
Cella* succ;
};
// Implementazione della classe CellaLista
// --------------------------------------
// costruttori
template <class T> Cella<T>::Cella()
{}
template <class T> Cella<T>::Cella(tipoelem e)
{
elemento = e;
}
template <class T> void Cella<T>::setElemento(tipoelem label)
{
elemento = label;
}
template <class T> T Cella<T>::getElemento() const
{
return elemento;
}
template <class T> void Cella<T>::setSucc(Cella<T>* p)
{
succ=p;
}
template <class T> Cella<T>* Cella<T>::getSucc() const
{
return succ;
}
template <class T> void Cella<T>::setPrec(Cella<T>* p)
{
prec=p;
}
template <class T> Cella<T>* Cella<T>::getPrec() const
{
return prec;
}
// sovraccarico dell'operatore ==
template <class T> bool Cella<T>::operator==(Cella<T> cella)
{
return (getElemento == cella.getElemento);
}
listap.h
#include "Lista.h"
#include <iostream>
using namespace std;
template<class T>
class circLista : public Lista<T>
{
public:
circLista();
~circLista();
// circLista(const circLista<T>&);
/* posizione è un puntatore a cella */
typedef Cella<T>* posizione;
typedef T tipoelem;
/* Prototipi degli operatori */
void crealista();
bool listaVuota() const;
tipoelem leggiLista(posizione) const;
void scriviLista(tipoelem, posizione);
posizione primoLista() const;
bool fineLista(posizione) const;
posizione succLista(posizione) const;
posizione precLista(posizione) const;
void insLista(tipoelem,posizione);
void cancLista(posizione);
// funzioni di servizio
private:
posizione lista; //la lista è un puntatore ad oggetto Cella
};
/* Liste: Rappresentazione collegata circolare (con sentinella)
* realizzata mediante doppi puntatori (o simmetrica)
*/
template <class T> circLista<T>::circLista()
{crealista();}
template <class T> circLista<T>::~circLista()
{
while (lista->getSucc() != lista->getPrec())
{
Cella<T>* posizione = lista->getSucc();
cancLista(posizione);
}
delete lista;
}
template <class T> void circLista<T>::crealista()
{
T ElementoNullo;
lista = new Cella<T>;
lista->setElemento(ElementoNullo);
lista->setSucc(lista);
lista->setPrec(lista);
//la sentinella punta a se stessa
}
template <class T> bool circLista<T>::listaVuota() const
{
return ((lista->getSucc() == lista) && (lista->getPrec()==lista));
}
template <class T> Cella<T>* circLista<T>::primoLista() const
{
return lista->getSucc();
}
template <class T> Cella<T>* circLista<T>::succLista(posizione p) const
{
return p->getSucc();
}
template <class T> Cella<T>* circLista<T>::precLista(posizione p) const
{
return p->getPrec();
}
template <class T> bool circLista<T>::fineLista(posizione p) const
{
return (p==lista);
}
template <class T> T circLista<T>::leggiLista(posizione p) const
{
return p->getElemento();
}
template <class T> void circLista<T>::scriviLista(tipoelem a, posizione p)
{
p->setElemento(a);
}
template <class T> void circLista<T>::insLista(tipoelem a, posizione p)
{
Cella<T>* temp = new Cella<T>;
temp->setElemento(a);
temp->setPrec(p->getPrec());
temp->setSucc(p);
(p->getPrec())->setSucc(temp);
p->setPrec(temp);
p=temp; // se p era la posizione dell'elemento n-mo, adesso lo è temp
}
template <class T> void circLista<T>::cancLista(posizione p)
{
Cella<T>* temp = new Cella<T>;
temp=p;
(p->getSucc())->setPrec(p->getPrec());
(p->getPrec())->setSucc(p->getSucc());
p=p->getSucc();
delete(temp);
}
對不起,代碼中的註釋(這是意大利)所使用的語言。
有人能解釋我如何處理這些錯誤?
我瞭解評論,但其他人可能不會。無論如何,你發佈的代碼太多,你應該縮小問題範圍,然後在這裏發佈相關的部分。 – 2014-11-08 14:40:04
你只粘貼了一部分錯誤而忽略了關鍵部分。 – jrok 2014-11-08 14:41:30
根據編譯器,錯誤在Lista.h的第30行,具體地說: 「virtual posizione primoLista()const = 0;」 我不知道是否張貼TestMain.cpp可以幫助,因爲我已經發布了太多的代碼,你已經指出了。 – DarthVi 2014-11-08 14:58:32