如何使用c ++中的一个方法获取派生类的名称

时间:2018-05-24 22:24:47

标签: c++ types abstract-class typeid

我有这个抽象的基类,我希望它能够获得从它派生的类的名称,无论可能是什么类。我想向用户隐藏此功能,因为我只是使用它来创建日志文件的名称或其他东西。我听说过typeid,但我无法编译。我也愿意能够获得对象的名称,而不是类。

#include <typeinfo>

class Base{ 
public:
    virtual void lol() = 0;
    std::string getName(); 
};

std::string Base::getName() {
    return typeid(*this);  // this doesn't work!
}


class Derived : public Base{
    void lol() {}; 
};

int main(int argc, char **argv) {

    Derived d;
    std::cout << d.getName() << "\n";

    return 0; }

3 个答案:

答案 0 :(得分:1)

在typeid上调用name(),如下所示:type_info::name

return typeid(*this).name();

顺便说一下,这确实使getName()函数有点多余。

答案 1 :(得分:1)

您可以利用预处理器并在GCC和Clang中使用__PRETTY_FUNCTION__或在Visual C ++中使用__FUNCTION__

#include <iostream>
#include <string>

class Base { 
public:
    virtual std::string getName();
};

std::string Base::getName() {
    return __PRETTY_FUNCTION__;
}

class Derived : public Base {
public:
    std::string getName() override {
        return __PRETTY_FUNCTION__;
    }
};

int main(int argc, char **argv) {
    Derived d;
    std::cout << d.getName() << "\n";
    return 0;
}

不幸的是,他们返回完整的方法名称,上面的示例输出

virtual std::__cxx11::string Derived::getName()

如果你需要它,你可以在Base中实现一个帮助函数,它将在最后::和空格之间提取一个类名。

std::string getName() override {
    return extractClassName(__PRETTY_FUNCTION__);
}

答案 2 :(得分:-2)

可能有几种方法可以做到这一点......

我可能会 1)在基类中创建一个抽象属性(或访问器函数),如:

2)然后在派生类的构造函数中,指定名称...然后基础可以使用它并查看它...