|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 211
|
[C++] Classe template che estende una classe template
Salve utenti esperti di c++, non riesco a risolvere questo problema:
Diciamo che ho una classe Node<T> (che rappresenta un nodo di un albero). Dovrebbe essere una classe astratta ma non ne sono sicuro. Ero abituato troppo bene con Java. Codice PHP:
Codice PHP:
- expected unqualified-id before '<' token - expected '{' before '<' token - expected template-name before '<' token Codice PHP:
Ultima modifica di biowep : 12-10-2014 alle 00:05. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12961
|
Mmm ci sono diversi errori.
Per prima cosa ti conviene piazzare tutte le classi template (e la loro implementazione) in dei file h, questo ti evita mal di testa con la sintassi verbosa di C++. Sintassi che per altro dovresti studiare meglio perché fai confusione tra variabili reference e puntatori. Final è stata introdotta in C++11, prima di questo non c'era alcuna keyword con quel nome, assicurati di compilare usando --std=c++11. Venendo al programma vero e proprio, non capisco perché vuoi distinguere in due classi Parent e Node, in un albero il parent di un nodo è ancora un nodo, o al massimo non esiste (se è la radice). Al tempo stesso non capisco perché fare riferimento al Tree in ogni singolo Nodo. Tieni presente che un albero può essere visto come puntatore al nodo radice. Codice:
template<typename T>
class Tree
{
Node<T>* root;
}
Ultima modifica di WarDuck : 12-10-2014 alle 12:25. |
|
|
|
|
|
#3 | ||||||
|
Member
Iscritto dal: Nov 2010
Messaggi: 211
|
Quote:
Quote:
Codice PHP:
Quote:
Quote:
Quote:
Codice PHP:
Quote:
Tornando al problema, posso fare una forward declaration di una classe template? (L'ho cercato, l'ho trovato da altre parti ma giuro che non sono riuscito a capire come fare praticamente). Qual è la sintassi corretta per definire ed implementare (magari distinguendo in file sorgente e file header) una classe template con parametro T che estende una classe template con lo stesso parametro? Ultima modifica di biowep : 12-10-2014 alle 12:59. |
||||||
|
|
|
|
|
#4 | |||||
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12961
|
Quote:
Per i template tipicamente si preferisce mettere tutto in un unico header. http://www.parashift.com/c++-faq-lit...n-vs-decl.html Quote:
Comunque puoi anche usare direttamente un reference nella classe (ed inizializzarlo nel costruttore come avevi fatto prima) ma naturalmente non può essere NULL. Quote:
Per esempio non è che sia il massimo il comportamento di getNext(), per altro potresti incorrere in dei cicli, ma comunque... Quote:
Potresti anche pensare di usare una funzione per generare nodi a partire dall'albero (simil-factory). Quote:
In genere cerco di evitare il più possibile queste dipendenze cicliche, specie usando i templates. Al limite anziché usare una classe astratta prova a decomporre usando un'interfaccia ed implementando quella. |
|||||
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 211
|
Le classi interne in C++ funzionano diversamente dal Java. Se la classe interna è pubblica può essere istanziata senza che esista un'istanza della classe esterna.
Per quanto riguarda la divisione tra dichiarazione ed implementazione di una classe template. Ho letto in in questo articolo: http://www.bogotobogo.com/cplusplus/...ile.php#sample Che il metodo consigliato è quello descritto nella porzione di codice. Lo stesso posso ottenerlo scrivendo la dichiarazione in un file .h e l'implementazione nel file .cpp con la differenza che sarà il file .h ad includere il file .cpp alla fine del suo codice. Esempio: Codice PHP:
Mi spiace ma scrivere tutto nell'header lo percepisco come sbagliato (anche nel caso volessi distribuire i file header e nascondere l'implementazione degli algoritmi), piuttosto torno a scrivere quello che ho in mente in java. Grazie delle risposte finora Ultima modifica di biowep : 12-10-2014 alle 17:20. |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Nov 2010
Messaggi: 211
|
Non funziona perché a quanto parte ogni file cpp crea una translation unit separata. Quello che si può fare però è definire l'implementazione in un altro file che generalmente viene chiamato tpp (t=template) oppure ipp(i=include) (poco usata) che viene incluso nel header che a sua volta viene incluso in ogni cpp in cui viene usata quella determinata classe template. Mi sembra un buon compromesso.
A questo punto credo che userò .cpp, .hpp, .tpp per uniformità EDIT: Tra l'altro l'estensione .tpp è riconosciuta anche da GitHub https://github.com/github/linguist/b.../languages.yml EDIT: Eclipse non riconosce come file c++ l'estensione .tpp quindi bisogna modificare le impostazioni in: Window > Preferences > General > Content Types > Text > C Source File > C++ Source File > C++ Header > Add > "*.tpp" > OK Ultima modifica di biowep : 12-10-2014 alle 19:58. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:02.




















