我正在教自己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);