您的位置:首页 > 编程语言 > C语言/C++

【C++】Vs2008中使用智能指针

2016-04-15 16:07 1151 查看
Tr1模块是C++11正式诞生前夕,已经确定加入新标准的C++特性。Vs2008算是C++11标准正式诞生前夕,对C++03和tr1标准支持的最好的一个IDE,是相当经典的一版,很多程序的开发和维护都还是使用vs2008。Vs2008要使用tr1标准,需要安装sp1补丁;在代码中使用tr1标准,需要加入tr1::前缀,如std::tr1::shared_ptr。符合C++11标准的编译器则可以直接使用,比如std::shared_ptr。

Vs2008sp1的tr1模块中,已经添加了诸如智能指针、正则表达式、哈希表、随机数生成器等特性。最常使用的智能指针是std::tr1::shared_ptr。

智能指针和普通指针在多态性上相似,都能从派生类指针自动隐式转换到基类指针(向上转换),不能自动从基类指针转到派生类指针(向下转换)。普通指针通过dynamic_cast函数实现向上向下转换,智能指针通过dynamic_pointer_cast实现转换。

例子如下:

struct A{virtual void print(){printf("A\n");}};
struct B:public A{virtual void print(){printf("B\n");}};
typedef std::tr1::shared_ptr<A> baseptr;
typedef std:: tr1::shared_ptr<B> derivedptr;

void foo1(A* a){printf("foo1: ");a->print();}
void foo2(B* b){printf("foo2: ");b->print();}
void foo3(baseptr a){printf("foo3: ");a->print();}
void foo4(derivedptr b){printf("foo4: ");b->print();}

int main(){
A* bp1 = new B;
B* dp1 = new B;
baseptr bp2 =derivedptr(new B);
derivedptr dp2 =derivedptr(new B);
foo1(bp1);
//foo2(bp1);//基类指针不能自动转换为派生类指针
//foo2(dynamic_cast<B>(bp1));//dynamic_case函数实现类型转换,B指针不能转换为B对象
foo2(dynamic_cast<B*>(bp1));
foo1(dp1);
foo2(dp1);

foo3(bp2);
//foo4(dynamic_cast<B>(bp2));// 智能指针不能用dynamic_cast转换
//foo4(dynamic_cast<B*>(bp2));// 智能指针不能用dynamic_cast转换
//foo4(dynamic_cast<derivedptr>(bp2)); //智能指针不能用dynamic_cast转换
foo4(std::tr1::dynamic_pointer_cast<B>(bp2));
foo3(dp2);
foo4(dp2);
delete bp1;
delete dp1
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: