微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

保持对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);

原文地址:https://www.jb51.cc/c/115819.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐