hel*_*rld 1 c++ casting shared-ptr
我有这个代码片段:
void addLineRelative(LineNumber number, LineNumber relativeNumber) {
list<shared_ptr<Line> >::iterator i;
findLine(i, number);
if(i == listOfLines.end()){
throw "LineDoesNotExist";
}
line 15 if(dynamic_cast<shared_ptr<FamilyLine> >(*i)){
cout << "Family Line";
} else {
throw "Not A Family Line";
}
}
Run Code Online (Sandbox Code Playgroud)
我有类 Line 并从它派生 FamilyLine 和 RegularLine,所以我想找到 FamilyLine
我的程序在第 15 行失败,我收到一个错误
cannot dynamic_cast target is not pointer or reference
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗,提前致谢
我试过这个:
shared_ptr<FamilyLine> ptr(dynamic_cast<shared_ptr<FamilyLine> >(*i));
if(ptr){
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
同样的错误
void addLineRelative(LineNumber number, LineNumber relativeNumber) {
list<shared_ptr<Line> >::iterator i;
findLine(i, number);
if(i == listOfLines.end()){
throw "LineDoesNotExist";
}
shared_ptr<FamilyLine> ptr(dynamic_pointer_cast<FamilyLine>(*i));
if (ptr){
cout << "Family Line";
} else {
throw "Not A Family Line";
}
}
Run Code Online (Sandbox Code Playgroud)
收到这个错误
Multiple markers at this line
- `dynamic_pointer_cast' was not declared in this
scope
- unused variable 'dynamic_pointer_cast'
- expected primary-expression before '>' token
Run Code Online (Sandbox Code Playgroud)
shared_ptr
不会隐式转换为指针 - 它是一个类类型对象 - and dynamic_cast
,static_cast
并且const_cast
都只对指针进行操作。
虽然您可以使用dynamic_cast
on shared_ptr<T>::get()
,但最好改为使用dynamic_pointer_cast<FamilyLine>()
,否则您可能会不小心引入 double- delete
s:
返回:
* 当dynamic_cast<T*>(r.get())
返回一个非零值时,一个shared_ptr<T>
存储它的副本并与 r 共享所有权的对象;
* 否则,一个空shared_ptr<T>
对象。
[...]
注释: 看似等效的表达式
shared_ptr<T>(dynamic_cast<T*>(r.get()))
Run Code Online (Sandbox Code Playgroud)
最终会导致未定义的行为,尝试删除同一个对象两次。
例如:
shared_ptr<FamilyLine> ptr(dynamic_pointer_cast<FamilyLine>(*i));
if (ptr) {
// ... do stuff with ptr
}
Run Code Online (Sandbox Code Playgroud)