保持对C中任何对象类型的引用?

我正在教自己C,而我一直使用的传统的“新语言”练习之一就是实现一些数据结构,比如一个二叉树或一个链表.在 Java中,这是比较简单的:我可以定义一些类保存了一个实例变量Object数组的类Node,以便有人可以在列表或树的每个节点中存储任何类型的对象. (后来我用泛型修饰了这个;这不是这个问题.)

我找不到类似的,惯用的C方式存储“任何类型的对象”.在C中我会使用一个void指针;相同的事情对于C来说很明显,但是当我构造一个std :: string的实例时,我遇到了问题,并尝试将它存储到列表/树中(关于一个无效的cast从std :: string& to void * ).有没有这样的方式? C是否具有Java对象(或Objective-C的NSObject)?

奖金问题:如果没有,并且我需要继续使用void指针,将std :: string存储到void *中的“正确”方式是什么?我偶然发现static_cast< char *>(str.c_str()),但是对于我想要做的事情似乎有些冗长.有没有更好的办法?

解决方法

与Java不同,C没有所有对象继承的基础对象.您想要做的通常方法是使用 templates.标准C库中的所有容器都使用此方法.

与Java不同,C不依赖于多态/继承来实现通用容器.在Java中,所有对象都从Object继承,所以任何类都可以插入到一个容纳Object的容器中.然而,C模板是编译时间结构,指示编译器为您使用的每种类型实际生成不同的类.所以,例如,如果你有:

template <typename T>
class MyContainer { ... };

然后,您可以创建一个接受std :: string对象的MyContainer,另一个使用int的MyContainer.

MyContainer<std::string> stringContainer;
stringContainer.insert("Blah");

MyContainer<int> intContainer;
intContainer.insert(3342);

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...