Нет, имя объекта существует только в вашем исходном коде. После компиляции ссылка на объект является просто смещением памяти. Если вы хотите узнать имя переменной, у вас должна быть строка где-то, описывающая ее.
Возможность получения имени переменной в языках с механизмами самоанализа (такими как Reflection) довольно ограничена и совсем не широко доступна. Даже в C # - девчачьем человеческом языке - чтобы получить имя переменной, вам нужно использовать причудливую функцию C # 3.5, называемую проекцией, а затем перепрыгивать через обручи, чтобы извлечь ее. Даже в этом случае вам нужно запрограммировать его - он не будет доступен ни в одной точке кода.
Подумав, вы задаете вопрос - получить имя объекта из функции-члена - теоретически невозможно . Рассмотрим этот сценарий:
class ObjA {
public:
void memberfunc() {
//confused??? instance1 or instance2?
}
};
//main
ObjA instance1;
ObjA* instance2 = &instance1;
instance2->memberfunc();
В приведенном выше примере у нас есть один экземпляр ObjA
с двумя переменными, указывающими на него (и я использую термин , указывающий довольно свободно здесь). Эти переменные находятся за пределами какого-либо мыслимого контроля над объектом, поэтому получить их невозможно, даже если имеется возможность получить имя переменной.
В C # вы можете использовать анонимные классы и Reflection для получения имени переменной. Способ сделать это довольно неловко, и если вы пытаетесь использовать это, чтобы продемонстрировать кому-то что-то, откажитесь сейчас, потому что вы оба будете сбиты с толку. В этом методе используются некоторые функции, которые являются новыми для массового программирования и включают анонимные классы, проекцию, методы расширения и Reflection.
public static class Extensions {
public static string GetFirstPropertyName(this object obj) {
return obj.GetType().GetProperties()[0].Name;
}
}
public class Program {
public static void Main() {
int intVal = 5;
var name = (new {intVal}).GetFirstPropertyName();
//name=="intVal"
}
}