Выражение Alpha*a = dynamic_cast
сначала преобразует p
в Alpha*
с явным приведением стиля c . Затем полученный результат Alpha*
пропускается через dynamic_cast
. Использование dynamic_cast
для указателя T*
(указатель того же типа, к которому вы пытаетесь привести) всегда будет обеспечивать входной указатель. Его нельзя использовать для подтверждения правильности указателя. Из cppreference для dynamic_cast
:
Если тип
blockquote>expression
точноnew_type
или менее квалифицированная по cv версияnew_type
, результатом является значениеexpression
, с типомnew_type
.В результате код всегда будет компилироваться и выполняться, а система типов не будет вас защищать. Но итоговое поведение не определено. В случае
Beta*b = dynamic_cast
вы говорите компилятору доверять, что((Beta*)p); p
являетсяBeta*
, но это не так. Разыменование результирующего указателя является неопределенным поведением, иdynamic_cast
не может защитить вас от этой ошибки.Если вы попытаетесь удалить явное преобразование типов, вы получите ошибку компилятора.
dynamic_cast
требует указателя или ссылки на полный тип, аvoid
не является полным типом. Вам нужно будет найти способ отследить фактический тип, указанный вам, и явно преобразоватьp
в этот тип указателя перед использованиемdynamic_cast
. Хотя в этот момент, если вы уже знаете тип, к которому нужно применить приведение, это может больше не понадобиться.Попробуйте использовать общий базовый тип вместо этого или, возможно, используйте
std::variant
илиstd::any
, если это необходимо.
Взгляните на этот похожий вопрос, который я задал некоторое время назад: Могу ли я просто создать атрибуты для моих тегов HTML?
Лично мне не очень нравятся предложенные ответы на размещение всех ваших данных в атрибуте класса. Кажется, просто ... неправильно, ты знаешь? По моему опыту, хотя ваша страница не будет действительной, если вы создадите атрибуты, я все равно делаю это. Протестируйте его в 4 основных браузерах, и если это работает, кого это волнует?
Лучшее решение, о котором я могу подумать, - это решение, которое недопустимо сейчас , но будет в HTML5, так что это хорошо , Как предлагает ms2ger в этом другом вопросе, добавьте свои пользовательские атрибуты к data-
Возможно, вам нужны новые атрибуты данных HTML 5.
This is relatively unknown but pretty dang useful: jQuery Metadata Plugin. It will let you store data within class names for retrieval. Its mostly used for the validation plugin but, really, can be adapted to any scenario.
Good luck with whatever you are working on.
В отсутствие какого-либо стандартного способа сделать это в HTML4 у меня возникнет соблазн создать скрытый элемент, соответствующий моему перетаскиваемому элементу, и сохранить в нем связанные данные. Назовите скрытый элемент относительно перетаскиваемого, чтобы вы могли легко найти информацию для него. Следующее расширение реализует это с помощью скрытого диапазона. Примечание: при тестировании я не мог воспроизвести ваши проблемы с перетаскиваемыми элементами - мне казалось, что data () работает нормально, но я не тестировал его с различными плагинами, только UI.Draggable.
Использование:
$('#draggableDiv').externalData('key','data');
var d = $('#draggableDiv').externalData('key');
jQuery.fn.externalData = function(key, data) {
var value = this;
this.each( function() {
var id = this.id+'_external_data';
var elem = jQuery('#'+id+':first');
if (elem.size() == 0) {
elem = $('<span style="display: none;" id="' + id + '"></span>"' );
elem.appendTo(document.body);
}
if (data) {
elem.data(key,data);
}
else {
value = elem.data(key);
return false;
}
});
return value;
};
Have a look at http://www.persvr.org/
Persevere features a new native object storage engine called JavaScriptDB that provides high-end scalability and performance
http://ajaxian.com/archives/perseveres-javascriptdb-impressive-json-performance