在链表中使用C++模板,列表中会显示多种不同的类型
Using C++ templates in Linked Lists, with multiple different types appearing in the list
(首先,作为免责声明,这与作业有关。我不是要求任何人为我做作业,只是试图帮助我理解如何正确实现模板。)
我目前的设置是:
我有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;
}
可以将指向A
、B
、C
或D
的指针分配给next
。确保在适当的情况下将成员函数标记为virtual
。
- 在模板中显示参数的类型
- 实例化模板时,我是否必须显式显示参数包中的类型?
- 运算符重载以显示用户定义的数据类型
- 为什么将函数的返回类型从结构节点*更改为void后,链表的元素没有显示create_ll和显示?
- C++如何在类Vector中显示不同类型的参数
- 回调方法显示错误,类型为"void(*)"的值不能用于初始化类型的实体
- C 尝试使用模板输出功能来显示不同类型的数据
- boost::variant 当 bool 显示为可能的类型时,会给出错误的结果
- VIM:执行复杂文件类型的脚本和显示结果
- 开关(事件类型)不工作和计时器不显示
- 在 c++ 中显示任何类型的结构的通用函数
- 显示为数据类型的纯虚拟类
- 以C++显示浮点类型的二进制表示形式
- 此背包代码显示浮点[float]无效类型错误.可能是什么原因
- 类型限定符出现在多项声明中(用指针显示奇怪的行为)
- 是否有类型特征显示一种类型是否可能包含其他类型的值
- C++ 显示字符串变量"<不完整类型>的调试窗口
- Switch语句不显示除默认语句之外的任何类型的输出
- 使QT/C 程序显示其文件类型,如Windows上已知
- lldb 可以显示类型定义的实际类型吗?