К сожалению, ни один из вышеперечисленных ответов не охватывает все базы - по крайней мере, не с моим тестированием с помощью 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"));
Не возможный. Поскольку на вещи, объект не имеет уникального имени.
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.
Ваш лучший выбор состоит в том, чтобы добавить аргумент строки к конструктору объектов и дать ему имя когда его созданный.
Так как объекты в C++ не имеют никаких имен, Вы не можете получить их. Единственной вещью, которую можно получить для идентификации объекта, является свой адрес.
Иначе, можно реализовать схему именования (что означает, что объекты имели бы приблизительно char*
или std::string
участник с их именем). Можно вселить себя в QT с их иерархией QObject, которая использует аналогичный подход.
Язык не предоставляет Вам доступ к той информации.
К тому времени, когда код был скомпилирован, все именованные объекты были переведены в относительные ячейки памяти. И даже эти местоположения перекрытие из-за оптимизации (т.е. после того как переменная больше не используется свое пространство, могут использоваться другой переменной).
информация, в которой Вы нуждаетесь, хранится в отладочных символах, которые сгенерированы большинством компиляторов, но они обычно разделяются от версий выпуска исполняемого файла, таким образом, Вы не можете гарантировать, что они существуют.
, Даже если бы отладочные символы существовали, они - весь компилятор/платформа specfic, таким образом, Ваш код не был бы портативным между ОС или даже компиляторами на той же ОС. Если Вы действительно хотите пройти этот курс, необходимо считать и понять, как отладчик для работ платформы (если Вы уже не записали компилятор, это очень не тривиально).
C++ действительно не поддерживает отражение. Однако немного поиска с помощью Google произвело несколько альтернативные методы , я сомневаюсь, что Вы найдете их полезными все же.
Это может быть GCC-конкретно:
#include <typeinfo>
#include <iostream>
template <typename T>
void foo(T t)
{
std::cout << typeid(t).name() << std::endl;
}
Объекты C++ не имеют 'имен' (если я не понимаю проблемы неправильно), Ваша лучшая надежда состоит в том, чтобы назвать их, поскольку Вы делаете их.
class NamedObject
{
String name;
NamedObject(String argname)
{
name = argname;
}
}
NamedObject phil("phil");
Если Вы имеете в виду название переменной, я не думаю, что это возможно. Возможно, если Вы компилируете с Параметром отладчика GNU на..., но даже таким образом я не думаю, что язык имеет конструкции, чтобы сделать это.