2011-01-16 3 views
0

Pour le code ci-dessous:C++ générique liste chaînée

#include <iostream> 
#include <string> 

using namespace std; 

class Foo2; 
class Foo3; 

template <class T> 
class Foo1 { 
    public: 
    Foo1(); 
    void print() { 
     cout << "My name is: " << name << endl; 
    } 

    T getNext(){ 
     return nextLink; 
    } 

    string name; 
    T nextLink; 

}; 

class Foo2 : public Foo1 { 
    public: 
    Foo2(){ 
     name = "Foo2"; 
    } 
}; 


class Foo3 : public Foo1 { 
    public: 
    Foo3(){ 
     name = "Foo3"; 
    } 
}; 

template <class T> 
class LinkedList { 



public: 
    T curr; 
    T first; 

void add(T node){ 
    if(first == NULL){ 
    first = node 
    } 
    node->nextLink = this; 
    curr = node; 
} 
T getNext(){ 
    return next; 
} 
void printAll(){ 
    T curr = first; 
    cout << "Contents are: " ; 
    while(curr != NULL){ 
    cout << curr.print() << ", "; 
    curr = curr.getNext(); 
    } 
} 

}; 

int main() { 
    LinkedList<?> list; 
    list.add(new Foo2()); 
    list.add(new Foo3()); 
    list.printAll(); 
    return 0; 
} 

je tente de mettre en œuvre une liste chaînée générique, je me rends compte que je pouvais importer <list> mais cela ne convient pas à mon projet. J'essaye d'avoir une liste liée des objets Foo2 et Foo3 - le ci-dessus est le meilleur que je pourrais accomplir comme je suis nouveau au C++.

Erreur:

generic.C: In instantiation of Foo1<Foo2>: 
generic.C:26: instantiated from here 
generic.C:22: error: Foo1<T>::nextLink has incomplete type 
generic.C:6: error: forward declaration of âclass Foo2 
generic.C: In instantiation of Foo1<Foo3>: 
generic.C:34: instantiated from here 
generic.C:22: error: Foo1<T>::nextLink has incomplete type 
generic.C:7: error: forward declaration of class Foo3 
generic.C: In member function void LinkedList<T>::add(T): 
generic.C:50: error: expected ; before } token 
generic.C: In member function T LinkedList<T>::getNext(): 
generic.C:55: error: ânextâ was not declared in this scope 
generic.C: In function âint main()â: 
generic.C:69: error: template argument 1 is invalid 
generic.C:69: error: invalid type in declaration before â;â token 
generic.C:70: error: request for member âaddâ in âlistâ, which is of non-class type âintâ 
generic.C:71: error: request for member âaddâ in âlistâ, which is of non-class type âintâ 
generic.C:72: error: request for member âprintAllâ in âlistâ, which is of non-class type âintâ 
+5

Et quel est le problème que vous rencontrez? –

+2

devoirs? sinon, pourquoi ne pas utiliser 'std :: list'? –

+3

Pourquoi 'std :: list' ne correspond pas à vos besoins? – jweyrich

Répondre

2

Je pense que le problème est le "?" dans LinkedList

Si c'est le cas, vous devez utiliser LinkedList<Foo1 *>. Pourquoi ne pouvez-vous pas utiliser std :: list?

Pourquoi? Peut-être que nous pouvons vous aider avec cela, il vaudra mieux que vous utilisiez votre propre implémentation.

+0

Je ne peux pas utiliser std :: list parce que je voudrais créer un LinkedList avec plusieurs choix possibles pour son prochain nœud - dont il choque un aléatoirement. – Kay

+3

Je vois, qu'en est-il de l'utilisation de std :: list ? Cela pourrait vous permettre d'utiliser std :: list et vous donner un groupe de "choix". Je pense que le mieux serait de ne pas penser à la liste et de se concentrer plutôt sur l'abstraction de votre problème. – MatiasFG

+1

'MultipleChoice'? Pourquoi ne pas simplement 'std :: list variant >'? – MSalters

3

Vous devez utiliser un T *, pas un T. Attend pour moi comme vous êtes venu de Java où tout est une référence. Il n'y a pas de ? dans les modèles C++. Je pense que vous devez d'abord prendre un livre sur le C++ de base, puis revenir aux modèles.

+0

Le "?" est le pour indiquer mon ignorance de ce qui devrait être là. – Kay

+2

@Kay: Oh ok. Je pensais que vous vouliez dire '?' De Java qui est un argument générique valide. Cependant, il y a tellement de problèmes dans votre code, vous avez besoin d'un livre. – Puppy

2

Malgré vos affirmations contraires, l'exemple que vous avez donné pourrait être résolu avec std::list:

std::list<Foo1 *> list; 

list.push_back(new Foo2()); 
list.push_back(new Foo3()); 

for (std::iterator<Foo1 *> it = list.begin(); it != list.end(); ++it) 
{ 
    (*it)->print(); 
} 

De toute évidence, il y a une fuite de mémoire ici ...

0

En combinant les bits, il semble que cela devrait fonctionner:

int main() { 
    std::list<boost::variant<Foo2, Foo3> > list; 
    list.push_back(Foo2()); 
    list.push_back(Foo3()); 
    printAll(list); // You'd still need to write this obviously. 
    return 0; 
}