C ++ Общий связанный список - PullRequest
       55

C ++ Общий связанный список

0 голосов
/ 16 января 2011

Для кода ниже:

#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â

Ответы [ 4 ]

3 голосов
/ 16 января 2011

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

2 голосов
/ 16 января 2011

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

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

2 голосов
/ 16 января 2011

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

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

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

0 голосов
/ 17 января 2011

Объединяя биты, кажется, это должно работать:

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