Problema con ALbero Binario e Template

di il
4 risposte

Problema con ALbero Binario e Template

Salve a tutti ,
devo creare un programma di un albero binario dove i nodi sono di tipo non definito , quindi bisogna utilizzare i template. il problema me lo da il main : una volta dichiarato un oggetto della classe albero ( Tree ) mi da errori quando voglio chiamare le funzioni membro. Incollo il programma diviso in 4 file :

TreeNode.h
#ifndef TREENODE_H_
#define TREENODE_H_
#include "Tree.h"

template <class NODE > class Tree;

template <class NODE >
class TreeNode {
	friend class Tree<NODE>;
public:
	TreeNode(const NODE &value): leftPtr(0), rightPtr(0), data(value){};
	NODE getData() { return data; };
private:
	TreeNode<NODE> *leftPtr;
	TreeNode<NODE> *rightPtr;
	NODE data;
};

#endif /* TREENODE_H_ */
Tree.h

#ifndef TREE_H_
#define TREE_H_
#include <iostream>
using namespace std;
#include "TreeNode.h"

template <class NODE >
class Tree {
public:
	Tree();
	void insertNode( NODE & );
	void stampa();
private:
	void Print( TreeNode< NODE > * );
	void insert( TreeNode< NODE > * , NODE &);
	TreeNode< NODE > *rootPtr;
};

#endif /* TREE_H_ */
Tree.cpp
#include "Tree.h"


template <class NODE>
Tree<NODE>::Tree() { rootPtr = 0; }

template <class NODE>
void Tree< NODE >::insertNode( NODE &d ) {
    insert(rootPtr, d);
}

template <class NODE>
void Tree< NODE >::insert( TreeNode<NODE> * ptr , NODE &d) {
	if ( ptr== 0 )
	     ptr = new TreeNode<NODE>(d);
	else
	  if ( ptr->data > d )
		  insert( &(ptr->leftPtr), d);
	  else if ( ptr-> data < d )
		  insert( &(ptr->rightPtr), d);
	  else
		  cout << "Valore gia' esistente: dup "<<endl;
}

template <class NODE>
void Tree<NODE>::stampa() {
	Print(rootPtr);
}

template<class NODE>
void Tree<NODE>::Print ( TreeNode<NODE> * ptr) {
    if (ptr!= 0)
    {
    	Print(ptr->left);
    	cout << ptr->data<< "  ";
    	Print(ptr->right);
    }
}

Main.cpp
#include <iostream>
#include "Tree.h"
using namespace std;

int main() {
	int value;
	Tree< int > x();
	for ( int i=0; i< 10; i++ )
	{
		cout << i << ". value: ";
		cin >> value;
		x.insertNode(value);
	}
	x.stampa();
	return 0;
}
Come potete vedere il programma fa inserire 10 valori creando per esempio un albero di tipo int e poi li deve stampare in ordine andando a richiamare le funzioni membro insertNode() e stampa(). In quest' ultime il compilatore mi da errore dicendo il seguendo messaggio:


Description Resource Path Location Type
request for member 'insertNode' in 'x', which is of non-class type 'Tree<int>()' Homework 15.cpp /Albero/src line 21 C/C++ Problem


Grazie in anticipo
Distinti Saluti,
Alessandro

4 Risposte

  • Re: Problema con ALbero Binario e Template

    Modifiche.
    1. togli tree.cpp. Una classe coi template DEVE essere svolta nel header. vedi le varie classi STL.
    2. cambia main così
    
    #include <iostream>
    #include "Tree.h"
    using namespace std;
    
    int main() {
    	int value;
    	Tree< int > x;
    	for ( int i=0; i< 10; i++ )
    	{
    		cout << i << ". value: ";
    		cin >> value;
    		x.insertNode(value);
    	}
    	x.stampa();
    	return 0;
    }
    
    3. cambia tree.h così
    
    
    #ifndef TREE_H_
    #define TREE_H_
    #include <iostream>
    using namespace std;
    #include "TreeNode.h"
    
    template <class NODE >
    class Tree {
    public:
    	Tree();
    	void insertNode( NODE & );
    	void stampa();
    private:
    	void Print( TreeNode< NODE > * );
    	void insert( TreeNode< NODE > *& , NODE &);
    	TreeNode< NODE > *rootPtr;
    };
    
    template <class NODE>
    Tree<NODE>::Tree() { rootPtr = 0; }
    
    template <class NODE>
    void Tree< NODE >::insertNode( NODE &d ) {
    	insert(rootPtr, d);
    }
    
    template <class NODE>
    void Tree< NODE >::insert( TreeNode<NODE> *& ptr , NODE &d) {
    	if ( ptr== 0 )
    		ptr = new TreeNode<NODE>(d);
    	else
    		if ( ptr->data > d )
    			insert( ptr->leftPtr, d);
    		else if ( ptr-> data < d )
    			insert( ptr->rightPtr, d);
    		else
    			cout << "Valore gia' esistente: dup "<<endl;
    }
    
    template <class NODE>
    void Tree<NODE>::stampa() {
    	Print(rootPtr);
    }
    
    template<class NODE>
    void Tree<NODE>::Print ( TreeNode<NODE> * ptr) {
    	if (ptr!= 0)
    	{
    		Print(ptr->leftPtr);
    		cout << ptr->data<< "  ";
    		Print(ptr->rightPtr);
    	}
    }
    #endif /* TREE_H_ */
    
    4. compila ed esegui. Da notare il metodo insert dove NON devi passare un puntatore per valore ma per riferimento.
  • Re: Problema con ALbero Binario e Template

    Grazie mille ho risolto ^^ non sapevo che quando si usano i template si deve scrivere tutto nell' header. Il problema del metodo insert perchè bisogna passare per riferimento? ho notato che se non lo passo per riferimento non mi funziona ma nn riesco a capire il motivo. Vabbè comunque non vorrei disturbare troppo quindi se è lunga la risposta non fa niente xD . Grazie ancora ^^
  • Re: Problema con ALbero Binario e Template

    Tu passi il valore del puntatore il quale viene sostituito dal new del nodo. Quando la funzione termina il valore del new è locale e ptr finisce per avere il valore precedente e quindi sempre NULL.
  • Re: Problema con ALbero Binario e Template

    È vero ! grazie ancora come ho fatto a non vederlo ^^ . Grazie di tutto

    Distinti Saluti ,
    Alessandro
Devi accedere o registrarti per scrivere nel forum
4 risposte