- 论坛徽章:
- 24
|
回复 #1 xinxinhao 的帖子
原帖由 xinxinhao 于 2007-9-30 17:37 发表 ![]()
问下各位高人...
我一直很疑惑,,,不知道我自己的C++学习到了什么程度,,,
C++到底学到什么水平啦才算学得差不多啦 ????
谢谢..谁能告诉我.
看懂这个就差不多啦:
http://www.stlchina.org/twiki/bin/view.pl/Main/BoostSource_any
//摘自”boost/any.hpp”
class any
{
public:
class placeholder //泛型数据容器holder的非泛型基类
{
public: // structors
virtual ~placeholder() //虚析构函数,为保证派生类对象能用基类指针析构
{}
public: // queries
virtual const std::type_info & type() const = 0; //提供关于型别的信息
virtual placeholder * clone() const = 0; //复制容器
};
template<typename ValueType>
class holder : public placeholder //
{
public: // structors
holder(const ValueType & value) //
: held(value)
{}
public: // queries
virtual const std::type_info & type() const
{
return typeid(ValueType); //typeid返回std::typeinfo对象引用,后者包含任意
//对象的型别信息如name,还提供operator==操作符
//你可以用typeid(oneObj)==typeid(anotherObj)来比
//两个对象之型别是否一致
}
virtual placeholder * clone() const
{
return new holder(held); //改写虚函数,返回自身的复制体
}
public: // representation
ValueType held; //数据保存的地方
};//类定义结束
placeholder * content; //指向泛型数据容器holder的基类placeholder的指针
template<typename ValueType>
any(const ValueType & value)
: content(new holder<ValueType>(value)) //模板构造函数,动态分配数据容器并调用其构
//造函数
{}
...
template<typename ValueType>
any & operator=(const ValueType & rhs) //与模板构造函数一样,但使用了swap惯用手法
{
any(rhs).swap(*this); //先创建一个临时对象any(rhs),再调用下面的swap函数进行底层
//数据交换,注意与*this交换数据的是临时对象,所以rhs的底层
//数据并未被更改,只是在swap结束后临时对象拥有了*this的底
//层数据,而此时*this也拥有了临时对象构造时所拥有的rhs的数
//据的副本。然后临时对象由于生命期的结束而被自动析构,*this
//原来的底层数据随之烟消云散。
return *this;
}
any & swap(any & rhs) //swap函数,交换底层数据
{
std::swap(content, rhs.content); //只是简单地将两个指针的值互换
return *this;
}
~any() //析构函数
{
delete content; //释放容器,用的是基类指针,这就是placeholder需要一个虚
//析构函数的原因
}
...
}; |
|
|