我正在尝试自己实现一个任意类型的数据列表,我想根据数据类型打印这个列表,在这一点上,我已经测试了整数和字符,要打印这些类型的列表,有两个方法print_int
和print_char
,这取决于要显示的数据类型,我的问题是,有没有可能只定义一个方法print
,它将根据我的列表的数据类型打印,而不创建类模板(不像List<type> ...
)?我的意思是没有这个类定义:
template <class T>
class List{
T *data;
List *next;
...
**-----------------------更新------------
最后,我找到了一个解决方案,它使我能够动态检查C中的类型(使用dynamic_cast
,请参阅公认的答案)。不幸的是,许多人错误地认为C受到严重限制。这证明了我的问题,许多人不知道答案,只会用减号来回答。
4条答案
按热度按时间dy2hfwbg1#
如果你想在列表中存储 any 类型而不丢失类型信息,你也可以尝试多态方法:
最后,
print
实现可能使用另一个函数的不同重载来实际打印data
值。边注:我倾向于将当前的
List
类重命名为Node
,并使其成为一个新创建的List
类的内部类,该类将在内部管理节点。如果您将指向head的唯一指针移动到的后继类,当前的列表实现很容易导致内存泄漏。6qftjkof2#
这是一个非常简单的列表!
这应该适用于任何支持普通流输出的类型。现在这应该可以让你开始了,但我会改变你实现list的方式很多。把list想象成一组节点的所有者。节点保存数据,但不是列表。
tpxzln5u3#
让我们尝试一种不同的方法:指向打印函数的指针。
让我们为print函数创建一个同义词:
由于每个节点可以是不同的类型,因此必须正确地初始化打印函数。
以下是一些附加转发声明:
下面是将节点打印到
std::cout
的代码片段:编辑1:数据继承
恕我直言,一个更干净的方法是对数据使用继承和基类(接口)。
在上面的模型中,我们假设每个节点的数据都有一个print方法和一个指向某些数据的指针。
整数数据示例:
下面是一些关于如何使用上面的
Node_Version_2
打印节点的代码:通过 * 多态性 *,将选择正确的打印函数。
0s0u357o4#
不幸的是,许多人错误地认为C是非常有限的。这就证明了我的问题,许多人不知道答案,就给它加上了减号。幸运的是,我找到了一个解决方案/答案,它使我能够**使用
dynamic_cast
在C**中动态检查类型。(它等于类型TypeToCheck
吗?)不幸的是,这只对类类型有效。我认为这很有帮助,所以实现如下:
列表类(
list.h
):测试文件(
main.cpp
):结果为: