如何解决在链接列表中使用C ++模板,列表中出现多种不同的类型
|| (首先,作为免责声明,这与一项作业有关。我并不是要任何人为我做作业,只是想帮助我了解如何正确实现模板。) 我当前的设置是: 我有A类,这是基础类。 B,C和D类是A类的所有子级。 我正在尝试制作一个链表,该链表在一个列表中可以指向B,C或D。 我目前的设置是这样的:enum Types { TypeB,TypeC,TypeD }
struct Node
{
void * pointerToElement;
int type;
Node * next;
};
struct Header
{
int counter;
Node * first;
};
这实际上有效。当我浏览链表以打印所有元素时,我使用and if语句和int type
标识它是哪种类型(基于定义的ENUM),然后使用static_cast
将void指针转换为的指针B,C或D类。
现在,有人告诉我必须使用模板,这引起了很多麻烦。我没有对模板做太多事情,但是我对模板的体验并不尽如人意。
我对模板的理解是,我可以使用它来定义EITHER类B,C或D的整个链表,但是将B,C或D都出现在同一个链表中似乎不合理吗?
我尝试了以下方法:
enum Types { TypeB,TypeD } // I realise that if templates work,I won\'t need this
template <class T>
struct Node
{
T * pointerToElement;
int type;
Node<T> * next; // Reason 1 I suspect I could only use one type
};
template <class T>
struct Header
{
int counter;
Node<T> * first; // Reason 2 I suspect I could only use one type
};
我的主要问题是,模板应该能够做到这一点吗?当在类中实现它时,我需要为报头指定一种类型,而这是我不想做的,因此我也将该类也作为模板,并且它一直跟踪我其余的代码, \不必是一个模板,最后到达main(),这里我不得不定义B,C或D类。
评论和建议表示赞赏。
谢谢。
编辑
感谢大家的评论,然后我可能从讲座中学到了更多的尝试方法。
我所做的几乎是废弃的模板,或者至少是我尝试使用它们的方式。我使用过模板(不幸的是,为了使用模板),它可以工作。这是我现在所做的(所有有用的评论都得出了结论……谢谢!)
template <class T>
struct Node
{
T * pointerToElement;
int type; // I can get rid of this after I go through the code and remove all references to it,which I am doing now.
Node<T> * next; // Reason 1 I suspect I could only use one type
};
template <class T>
struct Header
{
int counter;
Node<T> * first; // Reason 2 I suspect I could only use one type
};
仍然是这样,但是在声明Header时,我声明为:
标头* myHeader;
(我使用的类结构与以下解决方案中的类结构相同)。
因此,这指向了基类,所有其他类都派生自该基类。然后,由于继承,我可以毫无问题地将类B,C或D存储在其中,并且假设派生类(B,C和D)中定义的所有函数都在基类中定义,则可以将其称为直接使用而不需要强制转换(例如,它们都具有自己的打印功能,并且在派生类中定义了正确的功能)。
我认为,Assignment试图克服的想法是可以用于任何类型的链表,我认为如果模板应该用来定义不同的对象,可能会引起一些沟通不畅(可能主要是由于我)每个节点中的类类型,而是可以用来定义基类。
解决方法
您应该使用继承而不是模板。如您所料,模板会按类型type5ѭ创建实例,而这并不是您想要的。
您的代码应该在以下几行中:
class A{...};
class B: public A{...};
class C: public A{...};
class D: public A{...};
struct Node{
A *next;
}
您可以将next
指针分配给A
,B
,C
或D
。确保在适当的地方将成员功能标记为“ 12”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。