这是一个非常基本的代码示例,以及我想要的内容:
class B{
// Implementation of class B
};
class D : public B{
// Implementation of class D
};
int main(){
try{
// Code for try statement
}
catch(D & d){
// Handler for D
}
catch(B & b){
// Handler for B
}
return 0;
}
目前,我可以在处理程序中获取B类和D类的CXXRecordDecl(我可以从getCaughtType
类中的CXXCatchStmt
方法获取它们。
我想要做的是能够从D类访问B级CXXRecordDecl
,因为我们有class D : public B
。
我在class CXXRecordDecl
CXXRecordDecl
class D
上的{{1}}尝试了以下方法:
我现在没有想法。有人有想法吗?
答案 0 :(得分:3)
这是 Joachim Pileborg 在评论中给出的答案的实施。
bool VisitCXXTryStmt(CXXTryStmt * tryStmt){
int nbCatch = tryStmt->getNumHandlers();
for(int i = 0 ; i < nbCatch ; i++){
if(tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl() == nullptr){
cout << "The caught type is not a class" << endl;
}
else{
cout << "Class caught : " << tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->getNameAsString() << endl;
}
if(tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin() == nullptr){
cout << "This class is the base class" << endl;
}
else{
cout << "Base class caught : " << tryStmt->getHandler(i)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin()->getType().getAsString() << endl;
}
cout << "\n \n END OF LOOP \n \n" << endl;
}
return true;
}
为问题中给出的示例产生以下输出:
抓住了类:D
捕获的基类:B类
END LOOP
被捕获的类:B
此类是基类
END LOOP