首页 文章

在链接列表中使用C模板,列表中出现多种不同类型

提问于
浏览
2

(首先,作为免责声明,这与作业有关 . 我不是要求任何人为我做任务,只是为了帮助我了解如何正确实施模板 . )

我目前的设置是:

我有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;
};

这实际上有效 . 当我通过链表打印出所有元素时,我使用if语句和 int type 来识别它是什么类型(基于ENUM定义),然后使用 static_cast 将void指针强制转换为指针B,C或D类

现在,我被告知我需要使用模板,这引起了很大的麻烦 . 我对模板做的并不多,但我对它们的体验并不是那么令人愉快 .

我对模板的理解是我可以使用它来定义带有ECEER 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类 .

意见和建议表示赞赏 .

谢谢 .

Edit

感谢大家的评论,我可能从讲座中学到了更多的尝试 .

我所做的是相当多的模板,或者至少我尝试使用它们的方式 . 我使用过模板(不幸的是为了使用模板),它可以工作 . 这就是我现在所做的(所有有用的评论都得到了解答......谢谢!)

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
};

仍然是这样,但在宣布 Headers 时,我声明为:

Headers * myHeader;

(我正在使用与下面解决方案中的类结构相同的类结构) .

所以这指向了基类,即所有其他类派生自的基类 . 然后,由于继承,我可以在那里存储类B,C或D而没有任何问题,并且假定派生类(B,C和D)中定义的所有函数都在基类中定义,我可以调用它直接而不必抛出它(例如,它们都有自己的print函数,并且在派生类中定义时调用正确的函数) .

我认为Assignment试图通过的想法是一个链接列表,可以用于任何类型,我认为有一些错误传达(可能主要是由于我),我认为模板应该用于定义不同每个节点中的类类型,而不是它们可用于定义基类 .

1 回答

  • 1

    您应该使用继承而不是模板 . 正如您猜测的那样,模板按类型 T 创建实例,这不是您想要的 .

    你的代码应该是以下几行:

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

    您可以将 next 指针分配给 ABCD . 确保在适当的位置将成员函数标记为 virtual .

相关问题