2011-01-16 2 views
0

Для кода ниже:C++ Generic Linked List

#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; 
} 

Я пытаюсь реализовать общий связанный список, я понимаю, что я мог бы импортировать <list> но это не устраивает мой проект. Я пытаюсь иметь связанный список объектов Foo2 и Foo3 - выше, это лучшее, что я мог выполнить, поскольку я новичок в C++.

Ошибка:

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

И в чем проблема, которую вы испытываете? –

+2

домашнее задание? если нет, почему бы не использовать 'std :: list'? –

+3

Почему '' std :: list' не соответствует вашим потребностям? – jweyrich

ответ

2

Я думаю, что проблема в "?" in LinkedList

Если это так, то вы должны использовать LinkedList<Foo1 *>.

Почему вы не можете использовать std :: list? Может быть, мы сможем помочь вам в этом, это будет намного лучше, чем использование вашей собственной реализации.

+0

Я не могу использовать std :: list, потому что я хотел бы создать LinkedList с несколькими вариантами выбора для следующего узла, из которых он случайно выбирает. – Kay

+3

Я вижу, как насчет использования std :: list ? Это может позволить вам использовать std :: list и дать вам группу «вариантов». Я думаю, что лучше всего было бы не думать о списке и вместо этого сосредоточиться на абстрагировании вашей проблемы. – MatiasFG

+1

'MultipleChoice'? Почему бы не просто 'std :: list >'? – MSalters

3

Вы должны использовать T *, а не Т. Смотрит на меня, как вы пришли из Java, где все ссылки. В шаблонах C++ нет ?. Я думаю, что сначала нужно сначала взять книгу на базовом C++, а затем вернуться к шаблонам.

+0

«?» является указание на мое незнание того, что должно быть там. – Kay

+2

@Kay: О, хорошо. Я думал, вы имеете в виду Java '?', Который является допустимым общим аргументом. Однако в коде есть так много ошибок, вам нужна книга. – Puppy

2

Несмотря на все утверждения об обратном, на примере которых вы отправили может быть решена с 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(); 
} 

Очевидно, что существует потенциальная утечка памяти здесь ...

0

Комбинируя биты, его похоже, что это должно работать:

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; 
}