Как получить имя производного класса, используя один из его методов в c ++ - PullRequest
0 голосов
/ 25 мая 2018

У меня есть этот абстрактный базовый класс, и я хочу, чтобы он мог получить имя класса, производного от него, независимо от того, какой это может быть класс.Я хочу скрыть эту функциональность от пользователя, потому что я просто использую ее для создания имени файла журнала или чего-то еще.Я слышал о 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 голосов
/ 25 мая 2018

Вызовите name() для typeid, как показано здесь: type_info :: name

return typeid(*this).name();

Кстати, это действительно делает функцию getName() немного избыточной.

0 голосов
/ 25 мая 2018

Вы можете воспользоваться преимуществом препроцессора и использовать __PRETTY_FUNCTION__ в GCC и Clang или __FUNCTION__ в Visual C ++.

#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__);
}
0 голосов
/ 25 мая 2018

Может быть несколько способов сделать это ...

Я мог бы 1) создать абстрактное свойство (или функцию доступа) в базовом классе, например:

2), затем вконструктор производного класса, назначьте имя ... тогда база может использовать его и увидеть его ...

...