如果您想更广泛地了解我要制作的内容,此问题间接地跟在this question之后。
因此,基本上,我想区分捕获公共类的处理程序和捕获确实是子类的处理程序。
因此,通过前面提供的链接,我找到了一种方法来了解我是在处理简单类还是子类,但是,我无法获得与子类关联的基的CXXRecordDecl
。
例如,这是一段代码:
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
}
return 0;
}
通过以下代码,我可以得到
CXXRecordDecl
的class D
:bool VisitCXXTryStmt(CXXTryStmt * tryStmt){
CXXRecordDecl * child_class = tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl();
return true;
}
这可以正常工作,我可以通过
CXXRecordDecl
使用QualType
。所以我天真地以为这也可以得到基类:
bool VisitCXXTryStmt(CXXTryStmt * tryStmt){
CXXRecordDecl * base_class = tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin()->getType().getTypePtr()->getPointeeCXXRecordDecl();
return true;
}
但这将返回nullptr。但是,如果我执行此行:
cout << tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin()->getType().getAsString() << endl;
我有想要的输出(B类)。
那么,为什么在一种情况下可以有类声明,而在另一种情况下却没有?
最佳答案
我终于找到了获取我想要的CXXRecordDecl
的方法。
我对此没有合理的解释,但:
在第一种情况下,使用方法getPointeeCXXRecordDecl返回所需的CXXRecordDecl
。
在第二种情况下,使用方法getAsCXXRecordDecl返回所需的CXXRecordDecl
。
这些语句不能互换(第一种情况下使用getAsCXXRecordDecl
返回nullptr
,第二种情况下使用getPointeeCXXRecordDecl
也会返回nullptr
。
我没有任何解释,但是它确实可以按我的意愿工作,即使这让我有些烦恼,也不知道确切的原因:/
关于c++ - 为什么Clang有时会返回nullptr,有时会返回我想要的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25366057/