如何使用ctags获取C ++类实例?

时间:2013-02-20 18:20:15

标签: c++ ctags exuberant-ctags

例如我定义了一个像这样的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可以告诉我继承,成员,方法,访问类型(公共,私有)等。

但我如何才能发现小猫是猫的一个例子?

3 个答案:

答案 0 :(得分:1)

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

但是,正如你所能see,可能不是你想要的。

  

返回一个实现定义的以null结尾的字符串   包含类型的名称。不给予任何保证   特别是,返回的字符串对于几种类型可以是相同的   在同一程序的调用之间进行更改。

您可compare typeid使用其他知识类型,例如cat

您可以使用与对象名称相同的方向/样式进行制作,并在Animal中包含虚拟函数:

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

并在派生类中:

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

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

答案 1 :(得分:0)

可以使用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

答案 2 :(得分:0)

直接回答你如何检查kitty是否是猫的一个例子的问题可以这样做:

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

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