sharedfromthis几个值得注意的地方Word文档下载推荐.docx

上传人:b****4 文档编号:6631615 上传时间:2023-05-07 格式:DOCX 页数:5 大小:16.06KB
下载 相关 举报
sharedfromthis几个值得注意的地方Word文档下载推荐.docx_第1页
第1页 / 共5页
sharedfromthis几个值得注意的地方Word文档下载推荐.docx_第2页
第2页 / 共5页
sharedfromthis几个值得注意的地方Word文档下载推荐.docx_第3页
第3页 / 共5页
sharedfromthis几个值得注意的地方Word文档下载推荐.docx_第4页
第4页 / 共5页
sharedfromthis几个值得注意的地方Word文档下载推荐.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

sharedfromthis几个值得注意的地方Word文档下载推荐.docx

《sharedfromthis几个值得注意的地方Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《sharedfromthis几个值得注意的地方Word文档下载推荐.docx(5页珍藏版)》请在冰点文库上搜索。

sharedfromthis几个值得注意的地方Word文档下载推荐.docx

的构造函数中设置。

如下代码是错误的:

classD:

publicboost:

enable_shared_from_this&

D&

{

public:

D()

{

boost:

shared_ptr&

p=shared_from_this();

}

};

原因很简单,在D的构造函数中虽然可以保证enable_shared_from_this&

的构造函数已经被调用,但正如前面所说,weak_ptr还没有设置。

如下代码也是错误的:

voidfunc()

voidmain()

Dd;

d.func();

}错误原因同上。

如下代码是正确的:

voidmain()

d(newD);

d-&

func();

}这里boost:

d(newD)实际上执行了3个动作:

首先调用enable_shared_from_this&

的构造函数;

其次调用D的构造函数;

最后调用shared_ptr&

的构造函数。

是第3个动作设置了enable_shared_from_this&

的weak_ptr,而不是第1个动作。

这个地方是很违背c++常理和逻辑的,必须小心。

结论是,不要在构造函数中使用shared_from_this;

其次,如果要使用shared_ptr,则应该在所有地方均使用,不能使用Dd这种方式,也决不要传递裸指针。

另一个值得注意的地方是在类的继承树中不能有2个或更多个enable_shared_from_this&

例如如下代码是错误的:

classA:

A&

A():

a

(1){}

virtual~A(){}

get_ptra(){returnshared_from_this();

}

inta;

classB:

publicA,publicboost:

B&

B():

b

(2){}

get_ptrb()

returnboost:

shared_from_this();

intb;

int_tmain(intargc,_TCHAR*argv[])

x(newB);

a1=x-&

get_ptra();

b1=x-&

get_ptrb();

}return0;

}注意上面代码中,B同时拥有2个enable_shared_from_this的基类,一个是enable_shared_from_this&

,另一个是enable_shared_from_this&

在boost:

这行代码中,shared_ptr&

的构造函数仅会设置2个基类中的一个的weak_ptr。

在上面的例子中,仅设置enable_shared_from_this&

的。

如果修改B的定义为:

publicA,则仅设置enable_shared_from_this&

的weak_ptr。

很明显都是错误的。

那么enable_shared_from_this以及shared_ptr为何要如此实现呢?

又为什么会有如此怪异的结果呢?

首先考察shared_ptr的构造函数:

template&

classY&

explicitshared_ptr(Y*p):

px(p),pn(p)//Ymustbecomplete

detail:

sp_enable_shared_from_this(pn,p,p);

}template&

classT,classY&

voidsp_enable_shared_from_this(shared_countconst&

amp;

pn,boost:

const*pe,Yconst*px)

if(pe!

=0)pe-&

_internal_weak_this._internal_assign(const_cast&

Y*&

(px),pn);

}注意这个sp_enable_shared_from_this是一个模板函数,而且仅调用了一次,所以不可能2个enable_shared_from_this基类的weak_ptr都被赋值。

但问题在于,在调换了B的定义之后结果居然是不一样的。

这里有一个很隐秘的编译器BUG。

按道理来说,编译器在编译这段代码时,应该注意到无法真正决断该怎么实例化sp_enable_shared_from_this并且报一个错,但vc2008并没有报错,而是通过编译了。

(g++会在此处报错)那么正确的解法是怎样的呢?

classB:

publicA

dynamic_pointer_cast&

(shared_from_this());

 

注意到这里B并没有直接继承enable_shared_from_this,而是使用dynamic_pointer_cast进行了类型转换。

关于为什么enable_shared_from_this是这样实现的,可以参看作者原文:

Everyenable_shared_from_thisbasecontainsaweak_ptr,Theshared_ptrconstructorlooksuptheenable_shared_from_thisbaseandinitializesitsweak_ptraccordingly.Thisdoesn'

tworkwhenthereare

twoormoreenable_shared_from_thisbases,though.Icouldputtheweak_ptrinavirtualpolymorphicbase.Thiswouldforcepolymorphismonallclientsofenable_shared_from_this...probablyacceptable.Itwillalsoforceadynamic_pointer_castinevery

shared_from_this,andthismaybehardertoswallow,particularlyincaseswhereRTTIisoff.SoI'

mnotsure.Ifyoudowanttheabovebehavior,it'

seasytoduplicate,asIalreadyrespondedinmyfirstpostonthetopic.JustmakeFooBreturndynamic_pointer_cast&

(FooA())andremovetheenable_shared_from_this&

base(Aneedstobemadepolymorphic,ofcourse).注意为了让dynamic_pointer_cast能工作,A必须具有虚函数,那么最简单的做法当然是令其析构函数为虚函数(通常一个class如果希望被继承,析构函数就应该为虚函数)。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 考试认证 > 司法考试

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2