2014-11-08 52 views
1

我試圖建立一個自定義列表實現(用於練習目的)。目前我已經用遊標創建了一個實現,而通常用指針創建了一個實現(循環雙向鏈表)。我不想創建不同的泛型函數(打印列表,自然合併排序等),其中唯一的區別是所用的類)。所以我創建了一個具有純虛擬方法的抽象類,將其用作接口。我使用條件編譯來處理位置類型的不同實現(遊標實現中的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); 
} 

對不起,代碼中的註釋(這是意大利)所使用的語言。

有人能解釋我如何處理這些錯誤?

+0

我瞭解評論,但其他人可能不會。無論如何,你發佈的代碼太多,你應該縮小問題範圍,然後在這裏發佈相關的部分。 – 2014-11-08 14:40:04

+1

你只粘貼了一部分錯誤而忽略了關鍵部分。 – jrok 2014-11-08 14:41:30

+0

根據編譯器,錯誤在Lista.h的第30行,具體地說: 「virtual posizione primoLista()const = 0;」 我不知道是否張貼TestMain.cpp可以幫助,因爲我已經發布了太多的代碼,你已經指出了。 – DarthVi 2014-11-08 14:58:32

回答

0

我「解決」通過建立在Eclipse的CDT另一個項目文件夾和進口只有我需要在特定的測試文件的問題(在TestMain.cpp使用抽象類Lista,派生類circLista而不是ListaCursori,所以我不需要他們在同一個項目中)。我在舊的項目文件夾中檢查了多次#include聲明,並沒有發現任何錯誤。我認爲,在編譯或鏈接過程中,Eclipse可能會產生一些東西(使用ListaCursoricircLista,這樣就會出現覆蓋錯誤)。由於我在工具鏈編輯器設置(來源:Where is the Makefile generated by the Eclipse CDT?)中使用CDT Internal Builder,因此沒有makefile可用於在調試或發佈文件夾中進行進一步調查。 無論如何,我不會感到驚訝,因爲這不是第一次在Windows上做「奇怪」的事情(如果它真的是它的錯)。 感謝大家試圖幫助我,即使主要問題不是很清楚。