<b>在STL中处理对象指针</b>[VC/C++编程]
本文“<b>在STL中处理对象指针</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
众所周知,STL的容器类是针对对象来举行存储管理的.固然没有明确的限制不能在STL的容器类中包含指针,STL也不在乎您存放在容器中的对象还是指针.但细心考虑STL的初衷,在容器类中利用指针是明显不合时宜的.
CKER的意思是您应当尽大概的直接将对象本身而不是将对象的指针安排在STL容器类中.直接在容器中存放指针一个最大的副作用就是大概招致内存泄露.这个问题在char *范例上有突出的表现.
但某些时刻,直接利用对象指针有明显的好处,这些情形大致可以概括为以下的几个方面:
1. 当对象非常宏大时,频繁的拷贝复制所带来的系统资源损耗非常高贵.
2. 当您需求将同一个对象存放到多个容器中,这种情形应当不是很少见的.
3. 当您需求在同一个容器中存放由同一个父类派生而来的多个派生类对象.这也很常见.
事实上,CKER这个星期所开辟的计算程序中,正需求面对第三种情形.考虑利用STL的各种好处.
CKER决意引入STL的list容器.
本来,利用BCB的TList对象,也可以实现一样的目的.
但
TLsit类在对象指针的个数超越5000个时,效率会有明显的下降.
TList类不是范例安全的,它根本不在乎引入的对象指针是何种范例的.
引入TList类就意味着要包含VCL.h头文件,这对我的计算模块的可移植性实在不是一件功德.
cker做了决意之后,面对两个与stl有关的问题.
第一个问题就是上面提到的如安在STL中处理对象的指针.
CKER的办理之道是成立一个封装指针的类.
代码以下:
// 定义一个用于STL容器的指针封装类
// 因为利用STL不宜直接向容器中增添指针.
////////////////////////////////////////////////////////////////////////////////
class PtrWrapper
{
private:
X* px;//指向类X的指针
public:
file://构造及拷贝构造函数
PtrWrapper(X* x = 0) : px(x) {}
PtrWrapper(const PtrWrapper& pw) : px(pw.px) {}
file://析构函数
~PtrWrapper() {}
PtrWrapper& operator= (const PtrWrapper& pw) { px = xw.px; }
file://重载运算符()返回对象X的指针
const X* operator() () const { return px; }
X* operator() () { return px; }
};
file://重载逻辑运算符 == , < , >
bool operator== (const PtrWrapper& pw1, const PtrWrapper& pw2) {
return (pw1.operator()() && pw2.operator()()) ? *pw1() == *pw2() : false;
}
bool operator< (const PtrWrapper& pw1, const PtrWrapper& pw2) {
return (pw1() && pw2()) ? *pw1() < *pw2() : false;
}
bool operator> (const PtrWrapper& pw1, const PtrWrapper& pw2) {
return (pw1() && pw2()) ? !(*pw1() < *pw2()) : false;
}
上述代码封装了一个指针.经过类PtrWrapper的封装后,您就没有必要直接利用指针了.
以上是“<b>在STL中处理对象指针</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |