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
对象的对象,以及另一个带有int
s的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
归档时间: |
|
查看次数: |
6253 次 |
最近记录: |