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

前端之家收集整理的这篇文章主要介绍了保持对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&C++相关文章