(首先,作为免责声明,这与作业有关 . 我不是要求任何人为我做任务,只是为了帮助我了解如何正确实施模板 . )
我目前的设置是:
我有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 回答
您应该使用继承而不是模板 . 正如您猜测的那样,模板按类型
T
创建实例,这不是您想要的 .你的代码应该是以下几行:
您可以将
next
指针分配给A
,B
,C
或D
. 确保在适当的位置将成员函数标记为virtual
.