У меня есть класс, который содержит переменную-член, которая представляет собой список пользовательских объектов. Я пытаюсь написать функцию getter, которая просматривает этот список, пытаясь найти один с предоставленным именем. Я хотел бы вернуть указанный объект по постоянной ссылке, если найден, или просто вывести «Объект с именем» имя «не найден». в противном случае, без сбоев моей программы. Есть идеи? Я думаю, что я мог бы сделать еще одну функцию, которая просто возвращает логическое значение, если соответствующий объект существует, и вызывая это первым. Если он возвращает true, то получите данный элемент. Однако это неэффективно, и я хотел бы сделать лучше.Функция Getter, которая не будет разбиваться, когда объект не найден
ответ
Варианты:
сгенерирует исключение, если не найден - поймать его в вызывающем
Возвращение итератор - проверить
== .end()
, чтобы определить, если он не найден в вызывающем (STL делает это)есть функция возвращает указатель и вернуть
NULL
если не найденЕсть специальный объект, указывающий не найден, и возвращает ссылку на этот вопрос, когда он не нашел
Проверить наличие заранее (как вы упомянули)
Я бы взял «опциональную» оболочку над указателем. Он предотвращает дополнительную копию и распределение кучи. – pmr
Идея, что у вас есть отделения проверки существования и ценности восстановление, звук.
Это не по своей сути неэффективно, и во всяком случае, почему бы не попробовать его и не увидеть, окажется ли это узким местом или нет? и если первое имплантация кажется неэффективным, просто кешируйте подсказку или, возможно, весь результат проверки.
В противном случае ваши варианты включают в себя исключение, если оно не найдено, и использование некоторой реализации класса Baron/Nackman Fallible
как результат функции, например boost::optional
(или просто рулон)
И, думая об этом, вы можете просто вернуть указатель. Это может быть неудобно для типа объекта указателя или массива, но в целом это должно быть, пожалуй, самое чистое решение. Возвращает nullpointer, чтобы сигнализировать «объект не найден».
Вы можете предоставить 2 версии аксессорах, один бросает исключение, или молча возвращая пустой объект, другой имеет параметр, чтобы сообщить, что данные не существует:
class Props {
public:
const Object &get(const std::string &name) const; // throws exception or silently retruns empty
const Object &get(const std::string &name, bool &found) const; // returns flag
};
В C++ 11 это может быть чище :
class Props {
public:
const Object &get(const std::string &name, bool &&found = bool()) const;
};
я бы его обратно на C++ 11 версии, я не очень хорошо знаком с новыми возможностями языка, это, кажется, не быть чисты.
- 1. Array не будет разбиваться (используя splice (0))
- 2. Python - существует функция, которая вызывается, когда объект не реализует функцию?
- 3. Пользовательская функция: Объект не найден R
- 4. функция PowerShell не будет возвращать объект
- 5. Объект-объект не найден
- 6. Объект не найден выпуск
- 7. Python Ошибка - AttributeError: объект 'NoneType' не имеет атрибута "не разбиваться
- 8. участка: объект не найден
- 9. Приложение не будет разбиваться по назначению, пока в другом потоке
- 10. AngularJs функция не найден
- 11. объект не найден $ _GET
- 12. sp_rename Объект не найден
- 13. Строка с 'дисплеем: inline-block;' не будет разбиваться на строки
- 14. Приложение для Android не будет разбиваться с Eclipse
- 15. Struts Indexed Property - не найден метод getter для свойства
- 16. Three.js не будет отображаться, когда объект повернут
- 17. Объект TestComplete не найден
- 18. Magento Объект не найден
- 19. Функция не будет выполнена
- 20. Объект не найден Ошибка
- 21. функция PostgreSQL не найден
- 22. Объект не найден
- 23. Когда функция getter свойства вызывается в iOS
- 24. Объект не найден на CodeIgniter
- 25. Получение ошибки «Объект не найден»
- 26. Объект не найден - XAMPP
- 27. Объект не найден! CodeIgniter
- 28. Объект ресурса не найден
- 29. объект mktdata не найден
- 30. Объект не найден R
Можете ли вы использовать 'std :: list' и' std :: find() '? – Johnsyweb