Какова правильная парадигма создания списка указателей?

Попробуйте запустить azcopy --help, и вы должны получить список опций. Мое предположение - azcopy -y.

0
задан Matthieu Brucher 16 January 2019 в 17:33
поделиться

1 ответ

Нет, нет причины, по которой вы когда-либо делали бы это:

  OtherObject other_object = create_other_object();
  other_objects.push_back(&other_object);

Это создает временный объект, и вы сохраняете указатель в списке, а затем объект уничтожается.

В этом главное отличие Python. В Python каждый объект является ссылкой на объект Python, даже целые числа. В C ++ у вас есть объект в стеке (как у вас) или в куче (созданный через new, make_unique ...). Если вы хотите имитировать поведение Python, вам нужны объекты в куче.

Существует только три допустимых шаблона, в зависимости от того, что делает create_object():

  • он создает объект и возвращает его по значению. В этом случае оберните его make_unique, чтобы получить копию. Этот паттерн обычно не очень полезен и не практичен.
  • он создает новый объект в куче и ожидает, что вызывающий код будет обрабатывать управление памятью. Таким образом, прототип: std::unique_ptr<OtherClass> create_other_object();
  • он создает новый объект, но не ожидает, что вызывающий код будет обрабатывать управление памятью, и в этом случае прототип должен быть OtherClass* create_other_object();
[1115 ] В вашем случае, это, вероятно, второй случай:

std::vector<std::unique_ptr<OtherClass>> other_objects;
void method() {
    other_objects.push_back(create_other_object());
}
0
ответ дан Matthieu Brucher 16 January 2019 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: