template liste



  • hiho hab folgendes problem:
    error C2227: Links
    muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.

    und mein zweites problem:
    wie binde ich friend in Node ein ?

    hier der quellcode (ausschnitt)

    template <typename T> class CNode{
    	private:
    		T* pItem;
    		CNode<T>* pNext;
    	public:
    		T* getItem(){ return pItem; }
    		CNode<T>* getNext() { return pNext; }
    		//friend class CList; <--- wie binde ich den ein ?
    		CNode(){pItem = NULL; pNext = NULL;}	// Konstruktur für neuen Knoten
    };
    
    template<typename T> class CList{
    	private:
    		CNode<T>* pHead;	        //Listenanfang
    		CNode<T>* pCurrentNode;
    	public:
    
    ...
    		T* getItem(){ return pCurrentNode->getItem(); }	//liefert Zeiger auf aktuelles objekt
    };
    

    mein aufruf in der main:

    ...
    	CList<CObject*> Objects;
    ...
            if(Objects.getItem()->getNumbers() == sNumber); <--- fehler code 2227
    

    vielen dank schonmal



  • Zum Fehler: Besitzt denn die Klasse CObject eine Methode getNumbers()?

    @friends:
    CList ist keine Klasse, sondern ein Template - und du mußt schon dazusagen, welche Spezialisierung davon du als Freund haben willst:

    template<typename T> class CList;//Forward-Deklaration
    
    template<typename T>
    class CNode
    {
      ...
    public:
      friend class CList<T>;
      ...
    };
    
    template<typename T>
    class CList
    {...};
    

    (übrigens würde ich die Node als Subklasse von CList anlegen)



  • CNode<CObject*>::getItem() und CList<CObject*>::getItem() liefern ein CObject**.



  • danke cstoll für die den friend hinweiß 😉
    die deklaration hat gefällt

    CStoll schrieb:

    Zum Fehler: Besitzt denn die Klasse CObject eine Methode getNumbers()?

    int getNumbers() const { return num; }

    kann mir jemand weiterhelfen ?



  • Na dann greift wohl noch der Hinweis von MFK (den Punkt hatte ich wohl übersehen) - du bekommst einen Doppelpointer, den du auch doppelt dereferenzieren müsstest: (*(Objekts.GetItem))->getNumbers()

    (alternativ könntest du die GetItem()-Methoden so umbauen, daß sie einen T& zurückgeben)



  • i'm so sry bin grad neben der kappe aber müüst heut damit fertig werden.

    hab nun es so gemacht:

    template <class T> class CList;
    template <class T> class CNode{
    	private:
    		T pItem;
    		CNode<T>* pNext;
    	public:
    		...
    };
    
    template<class T> class CList{
    	private:
    		CNode<T>* pHead;	        //Listenanfang
    		CNode<T>* pCurrentNode;
    	public:
    		...
    		bool add(T element);
    		...
    
    };
    
    template <typename T> bool CList<T>::add(T element){
    	CNode* pNewNode;
    
    	try{ pNewNode = new CNode; }					
    	catch(bad_alloc){								
    		cout << "Fehler bei Allozierung" << endl;	
    		abort();								
    	}
    
    	pNewNode->pNext = pHead;
    	pNewNode->pItem = element;
    	pHead = pNewNode;
    
    	return 1;
    }
    

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol
    "public: bool __thiscall CList<class CObject *>::add(class CObject *)"

    i'm so sry aber was is nu los -.- ?



  • ah und der aufruf:

    ObjectList.add(ptrObject);

    ptrObject ist ein Zeiger



  • Stehen die Funktionen denn alle zusammen im Header? Wenn nicht, solltest du das ändern (sonst kann der Compiler die benötigten Template-Instanzen nicht zusammenbauen).



  • 👍


Anmelden zum Antworten