получить имя объекта C ++ во время выполнения - PullRequest
13 голосов
/ 22 января 2009

Могу ли я получить имя объекта во время выполнения (например, получить тип объекта через RTTI)? Я хочу, чтобы объект мог печатать свое имя.

Спасибо.

Ответы [ 8 ]

14 голосов
/ 22 января 2009

Поскольку объекты в C ++ не имеют имен, вы не можете их получить. Единственное, что вы можете получить для идентификации объекта - это его адрес.

В противном случае вы можете реализовать свою схему именования (это означает, что объекты будут иметь char* или std::string член с их именем). Вы можете вдохновить себя в Qt с их иерархией QObject, которая использует аналогичный подход.

9 голосов
/ 22 января 2009

Это невозможно. На самом деле, объект не имеет уникального имени.

A a;
A& ar = a;  // both a and ar refer to the same object

new A;  // the object created doesn't have a name

A* ap = new A[100];  // either all 100 objects share the same name, or need to 
                     // know that they are part of an array.

Лучше всего добавить строковый аргумент в конструктор объектов и дать ему имя при его создании.

3 голосов
/ 22 января 2009

Это может быть специфично для GCC:

#include <typeinfo>
#include <iostream>

template <typename T>
void foo(T t)
{
    std::cout << typeid(t).name() << std::endl;
}
3 голосов
/ 22 января 2009

Язык не дает вам доступа к этой информации.
Ко времени компиляции кода все именованные объекты были переведены в относительные области памяти. И даже эти местоположения перекрываются из-за оптимизации (то есть, когда переменная больше не используется, ее пространство может использоваться другой переменной).

Необходимая информация хранится в символах отладки, которые генерируются большинством компиляторов, но обычно они удаляются из выпусков исполняемого файла, поэтому вы не можете гарантировать их существование.

Даже если бы символы отладки существовали, они все были специфичны для компилятора / платформы, поэтому ваш код не был бы переносимым между ОС или даже компиляторами в одной и той же ОС. Если вы действительно хотите пройти этот курс, вам нужно прочитать и понять, как работает отладчик для вашей платформы (если вы еще не написали компилятор, это очень нетривиально).

2 голосов
/ 22 января 2009

C ++ не поддерживает рефлексию. Тем не менее, небольшое прибегание к гуглу дало пару альтернативных методов , но я сомневаюсь, что вы найдете их полезными.

1 голос
/ 22 января 2009

C ++ объекты не имеют «имен» (если я не понимаю проблему неправильно). Ваша лучшая надежда - назвать их по мере их создания.

class NamedObject
{
  String name;
  NamedObject(String argname)
  { 
    name = argname;
  }
}

NamedObject phil("phil");
1 голос
/ 22 января 2009

Если вы имеете в виду имя переменной, я не думаю, что это возможно. Возможно, если вы скомпилируете опцию GNU Debugger на ... но даже в этом случае я не думаю, что у языка есть конструкции для этого.

0 голосов
/ 06 марта 2017

Итак, это в основном то, что я сделал. Это хакерство, но оно делает свое дело. Я создал вариационный макрос, который использует преимущества строкового преобразования. К сожалению, он становится неуклюжим из-за необходимости использования параметра _dummy для обеспечения псевдо-значения по умолчанию для ctor, потому что вы не можете пропустить запятую, отделяющую именованный аргумент от аргументов переменной (я даже пытался использовать gnu cpp, но безуспешно - может Я не очень старался).

#include <string>

#define MyNamedClass( objname, ... ) MyClass objname(__VA_ARGS__, #objname )

class MyClass
{
public:
   MyClass( void* _dummy=nullptr, const std::string& _name="anonymous") : name( _name ) {}
   MyClass( int i, const std::string& _name="anonymous" ) : name( _name ) {}

private:
   std::string name;
};


int main()
{
   MyClass mc0;
   MyClass mc1(54321);
   MyNamedClass( mc2, nullptr);
   MyNamedClass( mc3, 12345 );

   return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...