Как я могу экспортировать 360-градусное изображение в Google Map Street View

Очень жаль, что вы так часто видите динамическое размещение. Это просто показывает, сколько плохих программистов на C ++ существует.

В некотором смысле у вас есть два вопроса, включенных в один. Во-первых, когда следует использовать динамическое распределение (используя new)? Во-вторых, когда следует использовать указатели?

Важное сообщение о возврате домой - это то, что вы всегда должны использовать соответствующий инструмент для задания. Почти во всех ситуациях есть что-то более подходящее и безопасное, чем выполнение ручного динамического распределения и / или использование необработанных указателей.

Динамическое распределение

В вашем вопросе вы продемонстрировали два способа создания объекта. Основное различие заключается в длительности хранения объекта. При выполнении Object myObject; внутри блока объект создается с автоматическим временем хранения, что означает, что он будет автоматически уничтожен, когда он выходит за рамки. Когда вы выполняете new Object(), объект имеет динамическую продолжительность хранения, что означает, что он остается живым, пока вы явно не delete его. При необходимости вы должны использовать только динамическую память. То есть, вы должны всегда предпочитать создавать объекты с автоматической продолжительностью хранения, когда сможете.

Основные две ситуации, в которых вам может потребоваться динамическое распределение:

  1. Вам нужен объект, чтобы пережить текущую область действия - этот конкретный объект в этой конкретной ячейке памяти, а не ее копию. Если вы согласны с копированием / перемещением объекта (в большинстве случаев вы должны быть), вам следует выбрать автоматический объект.
  2. Вам нужно выделить много памяти, которая может легко заполнить стек. Было бы неплохо, если бы нам не приходилось относиться к этому (большую часть времени вам не нужно), поскольку это действительно вне сферы компетенции C ++, но, к сожалению, нам приходится иметь дело с реальностью систем, которые мы для разработки.

Когда вам действительно требуется динамическое размещение, вы должны инкапсулировать его в интеллектуальный указатель или какой-либо другой тип, который выполняет RAII (например, стандартный контейнеры). Умные указатели предоставляют семантику владения динамически распределенных объектов. Посмотрите, например, на std::unique_ptr и std::shared_ptr . Если вы используете их надлежащим образом, вы почти полностью можете не выполнять собственное управление памятью (см. Правило нуля ).

Указатели

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

  1. Вам нужна эталонная семантика. Иногда вы хотите передать объект с помощью указателя (независимо от того, как он был выделен), потому что вы хотите, чтобы функция, к которой вы передаете его, имела доступ к этому конкретному объекту (а не к его копии). Однако в большинстве ситуаций вам следует выбирать типы ссылок для указателей, потому что это специально то, для чего они предназначены. Обратите внимание, что это не обязательно касается продления срока службы объекта за пределами текущего объема, как в ситуации 1 выше. Как и прежде, если вы согласны с передачей копии объекта, вам не нужна эталонная семантика.
  2. Вам нужен полиморфизм. Полиморфно (то есть в соответствии с динамическим типом объекта) вы можете вызывать функции только через указатель или ссылку на объект. Если это поведение вам нужно, вам нужно использовать указатели или ссылки. Опять же, ссылки должны быть предпочтительными.
  3. Вы хотите представить, что объект является необязательным, позволяя пропускать nullptr, когда объект опускается. Если это аргумент, вы должны предпочесть использовать аргументы по умолчанию или функции перегрузки. В противном случае вам следует использовать тип, который инкапсулирует это поведение, например std::optional (введенный на C ++ 17 - с более ранними стандартами на C ++, используйте boost::optional).
  4. Вы хотите отделить единицы компиляции улучшить время компиляции. Полезным свойством указателя является то, что вам требуется только объявление вперед для указанного типа (для фактического использования объекта вам потребуется определение). Это позволяет отделить части вашего процесса компиляции, что может значительно улучшить время компиляции. Смотрите Pimpl idiom .
  5. Вам нужно связать с библиотекой C или библиотекой C-стиля. На данный момент вы вынуждены использовать необработанные указатели. Лучшее, что вы можете сделать, это убедиться, что вы позволите своим сырым указателям освободиться в последний момент. Вы можете получить необработанный указатель от умного указателя, например, используя функцию члена get. Если библиотека выполняет какое-то выделение для вас, которое ожидает от вас освобождения через дескриптор, вы можете часто переносить дескриптор в интеллектуальный указатель с помощью настраиваемого удаления, которое соответствующим образом освободит объект.

-3
задан user10074679 13 July 2018 в 08:33
поделиться

1 ответ

Вы можете следовать этой документации о том, как загружать фотографии с помощью curl.

Для создания фотографии требуются три отдельных вызова. Первый вызов возвращает URL-адрес загрузки, который используется во втором вызове для загрузки байтов фотографий. После загрузки фотобайта третий звонок загружает метаданные фотографии и возвращает идентификатор фотографии.

  1. Запросить URL-адрес загрузки
    $ curl --request POST \
    --url 'https://streetviewpublish.googleapis.com/v1/photo:startUpload?key=YOUR_API_KEY' \
    --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
    --header 'Content-Length: 0'
    
  2. Загрузите фотобайты в URL-адрес загрузки
    $ curl --request POST \
    --url 'UPLOAD_URL' \
    --upload-file 'PATH_TO_FILE' \
    --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'
    
  3. Загрузите метаданные фотографии
    $ curl --request POST \
    --url 'https://streetviewpublish.googleapis.com/v1/photo?key=YOUR_API_KEY' \
    --header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
    --header 'Content-Type: application/json' \
    --data '{
              "uploadReference":
              {
                "uploadUrl": "UPLOAD_URL"
              },
              "pose":
               {
                 "heading": 105.0,
                 "latLngPair":
                 {
                   "latitude": 46.7512623,
                   "longitude": -121.9376983
                 }
              },
              "captureTime":
              {
                "seconds": 1483202694
              },
            }'
    

Также есть клиентские библиотеки которые вы можете использовать, чтобы избежать необходимости вручную настраивать HTTP-запросы и анализировать ответы.

0
ответ дан abielita 17 August 2018 в 13:21
поделиться
Другие вопросы по тегам:

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