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

К сожалению, ни один из вышеперечисленных ответов не охватывает все базы - по крайней мере, не с моим тестированием с помощью javascript с vanilla.

  • .value = null, похоже, работает с FireFox, Chome, Opera и IE11 (но не IE8 / 9/10)
  • .cloneNode.clone() в jQuery) на FireFox, похоже, скопирует .value, поэтому делает клон бессмысленным.

Итак, вот функция javascript vanilla, которую я написал, которая работает на FireFox (27 и 28), Chrome (33), IE (8, 9, 10, 11), Opera (17) ... это которые доступны мне для проверки.

function clearFileInput(ctrl) {
  try {
    ctrl.value = null;
  } catch(ex) { }
  if (ctrl.value) {
    ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);
  }
}

Параметр ctrl - это сам файл, поэтому функция будет вызываться как ...

clearFileInput(document.getElementById("myFileInput"));
14
задан dmeister 29 March 2009 в 10:58
поделиться

7 ответов

Не возможный. Поскольку на вещи, объект не имеет уникального имени.

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.

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

9
ответ дан 1 December 2019 в 08:20
поделиться

Так как объекты в C++ не имеют никаких имен, Вы не можете получить их. Единственной вещью, которую можно получить для идентификации объекта, является свой адрес.

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

14
ответ дан 1 December 2019 в 08:20
поделиться

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

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

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

3
ответ дан 1 December 2019 в 08:20
поделиться

C++ действительно не поддерживает отражение. Однако немного поиска с помощью Google произвело несколько альтернативные методы , я сомневаюсь, что Вы найдете их полезными все же.

2
ответ дан 1 December 2019 в 08:20
поделиться

Это может быть GCC-конкретно:

#include <typeinfo>
#include <iostream>

template <typename T>
void foo(T t)
{
    std::cout << typeid(t).name() << std::endl;
}
3
ответ дан 1 December 2019 в 08:20
поделиться

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

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

NamedObject phil("phil");
1
ответ дан 1 December 2019 в 08:20
поделиться

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

1
ответ дан 1 December 2019 в 08:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: