Подтвердить что ты не робот

Получить имя объекта С++ во время выполнения

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

Спасибо.

4b9b3361

Ответ 1

Невозможно. Для объекта объект не имеет уникального имени.

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.

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

#include <typeinfo>
#include <iostream>

template <typename T>
void foo(T t)
{
    std::cout << typeid(t).name() << std::endl;
}

Ответ 5

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

Ответ 6

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

Ответ 7

Объекты С++ не имеют "имен" (если я не понимаю проблему не так). Ваша лучшая надежда состоит в том, чтобы называть их, когда вы их делаете.

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

NamedObject phil("phil");

Ответ 8

Итак, это в основном то, что я сделал. Это взломанно, но это делает трюк. Я создал переменный макрос, который использует строение. К сожалению, он становится неуклюжим с необходимостью параметра _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;
}