2012-11-16 138 views
1

我有一个链表类(List),它只处理Node类型的对象。它可以对这些节点做各种各样的事情,假设它们已经正确地重载了​​布尔比较。事情是,我想用一个名为Term的特殊节点(一个具有系数和指数或度的代数项)来使用这个List类。即使使用节点指针处理条款,我如何告诉List类使用Term函数(Term有特殊版本的Print()函数和比较运算符)?例如,我的Print()类似于:从父类调用继承函数

Node* walker=head; 
while(walker) 
{ 
    walker->Print(); 
    walker=walker->next; 
} 

除了没有Node :: Print(),我希望它调用Term :: Print()!我是否必须创建一个全新的List类来处理Term类对象?

+0

请添加语言标签(可能是C++) –

回答

0

你已经从一般的商业设计发散 - 会建议使用模板,而不是从Node类派生。然后你会想要一个foreach方法,它将在每个节点上执行操作,在这种情况下是print。强烈建议使用C++标准库容器,而不是编码所有这些“原始”。

另一种选择(不太标准,并与设计缺陷)将衍生出一个PrintList将调用Print功能,而且将需要模板或Term节点而言,因为编译器会想到这个做功能。

+0

这是一个赋值,我们要构建一个链表类,然后使用继承来使类适应不同类型的节点(多项式,名称列表等)。我猜测对于每种情况,我应该直接修改节点类以包含适用于每种用途的适当更改......并且我还不知道如何执行模板,因为我们尚未覆盖课程中的那些模板。 – BrownBeard93423

+1

然后,我会为他们做好准备,因为他们是这项工作的适当工具。 – Puppy

+0

同意DeadMG,本质上如果你不打算使用模板,那么你将不得不做一些设计不当或者不正确或不好的练习,所以在避免重复一个班级方面并没有多少意义。 – djechlin

0

三种选择: -

在现实世界中,你可以使用std::list或类似容器类

或者,你可以作为虚拟方法节点,添加打印()(并使其抽象,潜在的)

class Node { 
    ... 
    virtual void Print() = 0; 
} 

或者,你可以使用强制转换节点*到期限*

Term *t = boost::polymorphic_cast<Term*>(walker); 
    t->Print(); 
1

这是多态性的经典例子。就像WhozCraig建议的那样,您可以将一个Print()函数添加到Node类中。 (请阅读C++中的虚拟函数和抽象类。)您可以使Print()成为虚函数。您可以决定是否要将Print()设置为纯虚函数。如果它是一个纯虚函数,它将在基类中声明为这样。

class Node{ 
    virtual void Print() = 0; 
    // If you don't want this to be pure virtual 
    // You can give a generic definition 
} 

在这种情况下,因为你没有在基类定义打印(),其不意味着是抽象每个派生类,必须实现此方法。因此,Term类可以派生自Node类并相应地实现它的Print()方法:)并且可以使用基类指针调用此函数。如果将来你决定继承节点,并添加不同的实现打印(),你不必改变节点在所有:)

希望这有助于!

+0

这确实有很大的帮助。但现在变得更加复杂了,因为我希望能够使用节点指针在Term对象上使用布尔比较运算符。例如,'if(* nodeptr1> = * nodeptr2){foo();}'其中nodeptr1和nodeptr2指向从Node类派生的Term类型的对象。我已经将虚拟布尔函数放在Node类中,然后在Term类中声明和定义它们,但仍然说Term函数是抽象的。混乱! – BrownBeard93423