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"));
这对我没有任何问题,但我不知道如何在链表中插入链表。
答案 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)