如何使用ctags获得C++类实例

How do I get C++ class instances using ctags?

本文关键字:实例 C++ 获得 何使用 ctags      更新时间:2023-10-16

例如,我定义了一个C++类,如下所示:

class cat : public animal
{
  public:
    cat(const char* nameString) : m_name(nameString) {}
    ~cat(){}
    const char* getName() {return m_name.c_str();}
 private:
    std::string m_name;
};

稍后:

cat kitty("Garfield");
printf("%s", kitty.getName());

对于上面的示例代码,ctags可以告诉我继承、成员、方法、访问类型(public、private)等。

但我怎么能发现kitty是猫的一个例子呢?

std::cout << "kitty is a: " << typeid(kitty).name() << 'n';

但是,正如你所看到的,可能并不是你想要的。

返回实现定义的以null结尾的字符串包含类型的名称。在特别是,对于几种类型和同一程序调用之间的更改。

您可以将typeid与其他已知类型(如cat)进行比较。

您可以按照与对象名称相同的方向/样式进行创建,并在Animal:中包含一个虚拟函数

virtual string whatAnimal()const{return "animal";}

在派生类中:

string whatAnimal()const override {return "cat";}

现在,您可以完全控制每个类型的字符串,而与代码中使用的名称约定无关。

可以用typeid获取对象的类名。不过,编译器会对名称进行标记,所以您应该在运行时对其进行适当的分解。

一个例子:

#include <iostream>
#include <cxxabi.h>
class cls {};
void main(){
    cls obj;
    int status;
    char * demangled_name = abi::__cxa_demangle(typeid(obj).name(),0,0,&status);
    std::cout << demangled_name << std::endl;
    free(demangled_name);
    return;
}

将输出:

   cls

直接回答您关于如何检查kitty是否是cat实例的问题可以通过以下方式完成:

if(typeid(cat) == typeid(kitty))
    // do something if kitty is a cat

注意,typeid(YourClass).name()返回nYourClass,其中n是类名的长度。