C ++在链表中存储链表

时间:2016-02-28 10:29:55

标签: c++ linked-list polymorphism

Class abstractClass
{
   int variable1;
   string variable2;
   public:
      abstractClass():variable1(0),variable2(""){};
      abstractClass(int variable1,string variable2)
      :variable1(variable1),variable2(variable2){};
      virtual void show() = 0;  
}

class SubClass : public abstractClass // one of the derived class
{
   string variable3;
   public:
      SubClass():variable3(""){};
      SubClass(int variable1,string variable2,string variable3)
      : abstractClass(variable1,variable2),variable3(variable3){};
      void show() {...}
}

class Problem
{
   int number;
   string name;
   LList<abstractClass*>a_list; // linked list of the abstractClass
   public:
      Problem():number(0),name(""){}; //how to initialize the linked list?
      Problem(int number,string name,LList<abstractClass*>a_list)
      :number(number),name(name),a_list(a_list){};
      void addList();
}

void addProblem(LList<Problem>p_list)
{
   p_list.enter(1,Problem(1,"TESTING",...));
   // For the ... is to enter a linked list of SubClass objects
}

我的问题是在每个p_list

中输入派生类'SubClass'的多个链表

我试过

a_list.enter(1,Subclass(111,"AAA","BBB"));

但这给了我错误。我是否需要为abstractClass和Subclass进行upcast,以便重载子类变量?还是有另一种方法可以做到这一点吗?

以前我尝试输入子类的链接列表,而不将抽象类的链接列表放在参数中。

Problem(int number,string name):number(number),name(name){};
LList<Problem> p_list(1,Problem(1,"NAME"));

这对我没有任何问题,但我不知道如何在链表中插入链表。

1 个答案:

答案 0 :(得分:0)

LList<abstractClass*>a_list;

这表示a_list是指向AbstractClass指针列表。

a_list.enter(1,Subclass(111,"AAA","BBB"));

这表示您要将 Subclass 类型的对象添加到a_list

C ++并不擅长猜测程序员真正想要的内容。如果你有一个指针列表,并且你想要添加一些东西,它最好是一个指针。一种方法是

a_list.enter(1, new Subclass(111,"AAA","BBB"));

这样可行,因为指向Subclass的指针可以自动转换为指向AbstractClass的指针。

请记住,拥有一个原始指针列表需要手动管理他们的记忆。在这方面,std::unique_ptr<Problem>列表要好得多。虽然我们正在使用它,但为什么不使用std::list而不是自制列表呢?

附加说明。您正试图按值传递列表。

addProblem(LList<Problem>p_list)

这可能不会很好,因为addProblem使用列表的副本,并在返回之前销毁它。您可能希望将其更改为使用按引用调用:

addProblem(LList<Problem>& p_list)