例如我定义了一个像这样的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可以告诉我继承,成员,方法,访问类型(公共,私有)等。
但我如何才能发现小猫是猫的一个例子?
答案 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是类名的长度。