Возврат ссылки на указатель - C ++ - PullRequest
1 голос
/ 22 января 2010

Рассмотрим следующий класс.

class mapping_items
{
public:

    mapping_items(){}

    void add(const mapping_item* item) {
        items_.push_back( item );
    }

    size_t count() const{
        return items_.size();
    }

    const mapping_item& find(const std::string& pattern){
        const mapping_item* item = // iterate vector and find item;
        return *item; 
    }

private:
    mapping_items(const mapping_items&); // not allowed
    mapping_items& operator=(const mapping_items&); // not allowed
    std::vector<const mapping_item*> items_;
};

C ++ FAQ говорит,

Используйте ссылки, когда можете, и указатели, когда вам нужно.

Так что в приведенном выше примере я должен вернуть const mapping_item& или const mapping_item*?

Причина, по которой я выбрал mapping_item&, заключается в том, что всегда будет доступно возвращаемое значение по умолчанию. У меня никогда не будет нулевого возврата. Таким образом, ссылка дает понять, что она не может иметь нулевые значения. Это правильный дизайн?

Ответы [ 4 ]

2 голосов
/ 22 января 2010

Существует проблема - что произойдет, если ваша функция find () не сработает?Если ожидается, что этого никогда не произойдет, вы в порядке и вернете ссылку (и создадите исключение, если это произойдет, несмотря на то, что этого не должно быть).Если, с другой стороны, это может произойти (например, поиск имени в адресной книге), вам следует рассмотреть возможность возврата указателя, поскольку указатель может быть НЕДЕЙСТВИТЕЛЕН, что указывает на сбой при поиске.

1 голос
/ 22 января 2010

Да, это правильный дизайн. Клиенты могут полагаться на значения, отличные от NULL.

В связанной заметке какой-то другой класс отвечает за управление временем жизни mapping_item's?

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

Если вам действительно нужны указатели, рассмотрите возможность использования boost :: shared_ptr <> вместо необработанных указателей, как внутри вашего класса, так и в качестве типов параметров, например. функция add ().

1 голос
/ 22 января 2010

Мне кажется, что это правильный выбор дизайна, как в C ++ FAQ, когда вы можете использовать ссылки. IMO, ненужное использование указателей просто кажется , чтобы сделать код труднее для понимания.

0 голосов
/ 22 января 2010

Некоторые люди говорят, и я согласен,

используйте указатели, если значение может быть NULL и ссылки в противном случае

Что касается вашего примера, я бы, вероятно, выбрал return const mapping_item;, то есть по значению, чтобы избежать ссылки на временный объект и надеялся, что мой компилятор оптимизирует копирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...