此问题间接跟随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
的{{1}}:
class D
这很好,我可以通过bool VisitCXXTryStmt(CXXTryStmt * tryStmt){
CXXRecordDecl * child_class = tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl();
return true;
}
获得CXXRecordDecl
。
所以我无辜地认为这样做也可以得到基类:
QualType
但是这会返回nullptr。但是,如果我正在执行此行:
bool VisitCXXTryStmt(CXXTryStmt * tryStmt){
CXXRecordDecl * base_class = tryStmt->getHandler(0)->getCaughtType().getTypePtr()->getPointeeCXXRecordDecl()->bases_begin()->getType().getTypePtr()->getPointeeCXXRecordDecl();
return true;
}
我有我想要的输出( B类)。
那么,为什么我可以在一个案例中使用类声明,而不是在另一个案例中?
答案 0 :(得分:0)
我终于找到了一种方法来获得我想要的CXXRecordDecl
。
我没有合理的解释,但是:
CXXRecordDecl
。CXXRecordDecl
。 这些语句不能互换(在第一种情况下使用getAsCXXRecordDecl
返回nullptr
,而在第二种情况下使用getPointeeCXXRecordDecl
也返回nullptr
。
我没有解释,但它确实按照我的意愿行事,即使这让我有点不知道原因:/
答案 1 :(得分:0)
旧帖子,但是由于偶然发现,我想澄清一下:您正在混用getPointeeCXXRecordDecl
和getAsCXXRecordDecl
。前者仅用于D & d
在您的catch
中定义的指针和引用类型。但是class D
的基类(存储在您通过CXXBaseSpecifier
访问的bases_begin()
内部)不是指针或引用类型,它只是一个无聊的记录类型。这就是为什么您需要在一种情况下使用getAsCXXRecordDecl
而不在另一种情况下使用的原因。