Tim*_*Tim 9 c++ pointers linked-list object
我正在尝试自学C++,而我一直使用的传统"新语言"练习之一是实现一些数据结构,如二叉树或链表.在Java中,这相对简单:我可以定义一些维护实例变量的类Node Object data,以便有人可以在列表或树的每个节点中存储任何类型的对象.(后来我使用泛型来修改它;这不是这个问题的内容.)
我找不到类似的,惯用的C++方式来存储"任何类型的对象".在C中,我使用void指针; 同样的事情适用于C++,很明显,但后来我碰到的时候我构建的一个实例问题std::string,并尝试将其保存到列表/树(一些关于一个无效的转换,从std::string&到void*).有这样的方式吗?C++是否具有Java的Object(或Objective-C的NSObject)的等价物?
奖金问题:如果没有,我需要继续使用无效指针,将"存储"的"正确"方式std::string是void*什么?我偶然发现了static_cast<char*>(str.c_str()),但这似乎有点冗长我正在努力做的事情.有没有更好的办法?
Cha*_*via 12
与Java不同,C++没有所有对象继承的基础对象.您想要做的通常做法是使用模板.标准C++库中的所有容器都使用此方法.
与Java不同,C++不依赖于多态/继承来实现通用容器.在Java中,所有对象都继承自Object,因此任何类都可以插入到一个容器中Object.但是,C++模板是编译时构造,它指示编译器为您使用的每种类型实际生成不同的类.所以,例如,如果你有:
template <typename T>
class MyContainer { ... };
Run Code Online (Sandbox Code Playgroud)
然后MyContainer,您可以创建一个带有std::string对象的对象,以及另一个带有ints的MyContainer .
MyContainer<std::string> stringContainer;
stringContainer.insert("Blah");
MyContainer<int> intContainer;
intContainer.insert(3342);
Run Code Online (Sandbox Code Playgroud)
你可以看一下boost :: any class.它是类型安全的,你可以把它放到标准集合中,你不需要链接任何库,该类在头文件中实现.
它允许您编写如下代码:
#include <list>
#include <boost/any.hpp>
typedef std::list<boost::any> collection_type;
void foo()
{
collection_type coll;
coll.push_back(boost::any(10));
coll.push_back(boost::any("test"));
coll.push_back(boost::any(1.1));
}
Run Code Online (Sandbox Code Playgroud)
完整文档在这里:http://www.boost.org/doc/libs/1_40_0/doc/html/any.html