2013-02-24 2 views
0

У меня есть класс, который содержит переменную-член, которая представляет собой список пользовательских объектов. Я пытаюсь написать функцию getter, которая просматривает этот список, пытаясь найти один с предоставленным именем. Я хотел бы вернуть указанный объект по постоянной ссылке, если найден, или просто вывести «Объект с именем» имя «не найден». в противном случае, без сбоев моей программы. Есть идеи? Я думаю, что я мог бы сделать еще одну функцию, которая просто возвращает логическое значение, если соответствующий объект существует, и вызывая это первым. Если он возвращает true, то получите данный элемент. Однако это неэффективно, и я хотел бы сделать лучше.Функция Getter, которая не будет разбиваться, когда объект не найден

+0

Можете ли вы использовать 'std :: list' и' std :: find() '? – Johnsyweb

ответ

2

Варианты:

  • сгенерирует исключение, если не найден - поймать его в вызывающем

  • Возвращение итератор - проверить == .end(), чтобы определить, если он не найден в вызывающем (STL делает это)

  • есть функция возвращает указатель и вернуть NULL если не найден

  • Есть специальный объект, указывающий не найден, и возвращает ссылку на этот вопрос, когда он не нашел

  • Проверить наличие заранее (как вы упомянули)

+0

Я бы взял «опциональную» оболочку над указателем. Он предотвращает дополнительную копию и распределение кучи. – pmr

0

Идея, что у вас есть отделения проверки существования и ценности восстановление, звук.

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

В противном случае ваши варианты включают в себя исключение, если оно не найдено, и использование некоторой реализации класса Baron/Nackman Fallible как результат функции, например boost::optional (или просто рулон)

И, думая об этом, вы можете просто вернуть указатель. Это может быть неудобно для типа объекта указателя или массива, но в целом это должно быть, пожалуй, самое чистое решение. Возвращает nullpointer, чтобы сигнализировать «объект не найден».

0

Вы можете предоставить 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 версии, я не очень хорошо знаком с новыми возможностями языка, это, кажется, не быть чисты.

Смежные вопросы