在链表中使用C++模板,列表中会显示多种不同的类型

Using C++ templates in Linked Lists, with multiple different types appearing in the list

本文关键字:显示 类型 列表 链表 C++ 模板      更新时间:2023-10-16

(首先,作为免责声明,这与作业有关。我不是要求任何人为我做作业,只是试图帮助我理解如何正确实现模板。)

我目前的设置是:

我有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类的指针。

现在,有人告诉我必须使用模板,这让我非常头疼。我对模板做得不多,但我对模板的体验并不那么愉快。

我对模板的理解是,我可以用它来定义整个B类、C类或D类的链表,但让B、C或D都出现在同一个链表中是不合理的吗?

我尝试过以下几种:

enum Types { TypeB, TypeC, 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)中定义的所有函数都在基类中定义,我可以直接调用它,而不必强制转换它(例如,它们都有自己的print函数,当它在派生类中定义时,它会调用正确的函数)。

我认为Assignment试图传达的想法是一个可以与任何类型一起使用的链表,我认为存在一些沟通错误(可能主要是由于我),因为我认为模板应该用来定义每个节点中的不同类类型,而不是用来定义基类。

应该使用继承而不是模板。正如您所猜测的,模板按照类型T创建实例,但这并不是您想要的。

你的代码应该是这样的:

class A{...};
class B: public A{...};
class C: public A{...};
class D: public A{...};
struct Node{
    A *next;
}

可以将指向ABCD的指针分配给next。确保在适当的情况下将成员函数标记为virtual