2016-04-21 3 views
1

Я хотел бы сохранить имя моего объекта в виде строки. Могу я объяснить использование нескольких строк кода.Как сохранить имя объекта в виде строки

#include <iostream> 
#include <string> 
#include <stdio.h> 

using namespace std; 

class Example 
{ 
public: 
    string object_name; 
    //code... 
}; 

int main() 
{ 
    Example object; 
    cout<<object.object_name<<endl; //In this case the output should be "object", how to achieve this ? 
    return 0; 
} 
+2

Вы установили его с помощью: 'object.object_name =" object ";' - Я уверен, что это не тот ответ, который вам нужен, но C++ не имеет такого отражения/самоанализа. –

+2

Возможный дубликат [получить имя объекта C++ во время выполнения] (http://stackoverflow.com/questions/468956/get-c-object-name-in-run-time) –

+0

Возможно, посмотрите на [C++ reflexion] (http://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-ac-application) – steiner

ответ

0

Чтобы получить эту функцию в C++, вы должны были бы установить object_name себя, и единственный способ сделать это без избыточно указать его для Example экземпляра и его член данных object_name является использование макроса для хранения «строковый» идентификатор:

#define EXAMPLE(IDN) Example IDN{ #IDN } 

EXAMPLE(object); 

это довольно некрасиво ИМХО: люди спутать его вызов функции во время выполнения.

3

Нет доступа к имени переменной из внутреннего объекта, поскольку он существует только на уровне исходного кода. Лучше вы можете сделать, это указать название объекта в конструкторе: Example object("object"), вы даже можете обернуть его в макрос, чтобы избежать дублирования:

#define CREATE_OBJECT(TYPE, NAME) TYPE NAME(#NAME) 

CREATE_OBJECT(Example, object); 

Вы должны меняться в зависимости от копирования/перемещения объектов, так как он сохранит имя которые могут не соответствовать имени копии. Вам удастся удалить конструкторы копирования/перемещения, что значительно снизит полезность вашего объекта и определит новые конструкторы, которые берут существующий объект и новое имя, и создаст для него макрос COPY_OBJECT.

Даже тогда есть проблема со ссылками ...

TL; DR: оно обычно не стоит.

Смежные вопросы