Изменение функции для возврата указателя - PullRequest
0 голосов
/ 25 августа 2011

Я довольно новичок в C ++, и я написал класс и функцию ниже:

class Person {
    public:
        boost::shared_ptr<Details> GetDetails(const std::string& name) const;
        ...
    private:
        std::map<std::string, boost::shared_ptr<Details> > map;
        ...
};

inline
boost::shared_ptr<Details>
Person::GetDetails(const std::string& name) const {
    return map.find(name)->second;
}

Это работает нормально, но мне сказали, чтобы функция возвращала указатель, а в случае сбоя поиска возвращала NULL.

Я попробовал пару вещей, одна из которых:

class Person {
    public:
        boost::shared_ptr<Details> *GetDetails(const std::string& name) const;
        ...
    private:
        std::map<std::string, boost::shared_ptr<Details> > map;
        ...
};

inline
boost::shared_ptr<Details>
*Person::GetDetails(const std::string& name) const {
    if (!map.find(name)->first.empty()) {
        return *map.find(name)->second;
    }
    return NULL;
}

что дает мне ошибку:

error: cannot convert 'Details' to 'boost::shared_ptr<Details>*' in return

Я не совсем уверен, что здесь делать. Любая помощь или ресурсы будут очень полезны.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 25 августа 2011

Вы хотите вернуть адрес общего указателя, поэтому вам нужно использовать &, а не *.

Обратите внимание, что работа с указателями на разделяемые указателинемного странноПочему бы просто не вернуть пустой разделяемый указатель, если вы не можете найти элемент?

1 голос
/ 25 августа 2011

Вы должны проверить то, что вы нашли, прежде чем получить доступ к first или second:

inline
boost::shared_ptr<Details> 
Person::GetDetails(const std::string& name) const {
    std::map<std::string, boost::shared_ptr<Details> >::iterator i = map.find(name);

    if (i != map.end()) return i->second;
    return boost::shared_ptr<Details>(); // empty shared_ptr if not found
}

, но не возвращайте голые указатели.Это было бы опасно.

Обоснование:

  • find() возвращает map.end() итератор после последней записи.Таким образом, нет записи для доступа.
  • map.find(name)->first.empty() было бы неопределенным поведением, так как теперь может быть пустая строка в конце вашей карты.
  • shared_ptr выполняет все управление памятью,Возврат сырых указателей может все это испортить.
1 голос
/ 25 августа 2011

Вам необходимо вернуть пустое boost::shared_ptr<Details>

return boost::shared_ptr<Details>();

вместо этого

return NULL;

Также возврат указателя на shared_ptr - плохая идея. Ваша предыдущая версия выглядит лучше.

...