Вектор указатель и push_back () - PullRequest
3 голосов
/ 18 марта 2011

Если у меня есть

void f(vector<object> *vo) {

}

И я передаю адрес вектора в f

vector<object> vo;
f(&vo);

Как бы я использовал push_back() для добавления к вектору?

1 Ответ

10 голосов
/ 18 марта 2011

Разыменуйте указатель:

(*vo).push_back(object());
vo->push_back(object()); // short-hand

Обратите внимание, что это базовая концепция языка, вам может быть полезно прочитать хорошую книгу .


Обратите внимание, что у этого есть явный недостаток:

f(0); // oops, dereferenced null; undefined behavior (crash)

Чтобы сделать вашу функцию безопасной, вам нужно правильно обрабатывать все допустимые значения указателя (да, нулевое является допустимым значением).Либо добавьте какую-нибудь проверку:

if (!vo) return;
// or:
if (!vo) throw std::invalid_argument("cannot be null, plz");

Или сделайте свою функцию по своей сути правильной, используя ссылку:

void f(vector<object>& vo) // *must* reference a valid object, null is no option
{
    vo.push_back(object()); // no need to dereference, no pointers; a reference
}

Теперь ответственность за функцию лежит на вызывающей сторонес действительной ссылкой.

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