Использование unique_ptr & lt; CBitmap & gt; с VS2017 [дубликат]

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

С помощью

if (condition){
    function myfunction(){
        // Some code
    }
}

это определение myfunction переопределит любое предыдущее определение, так как оно будет выполнено во время синтаксического анализа.

Хотя

if (condition){
    var myfunction = function (){
        // Some code
    }
}

выполняет правильную работу по определению myfunction только тогда, когда condition выполнено.

42
задан vigs1990 4 June 2013 в 18:16
поделиться

2 ответа

Как первое замечание, я бы не назвал его ObjectArray, если это карта, а не массив.

В любом случае вы можете вставить объекты таким образом:

ObjectArray myMap;
myMap.insert(std::make_pair(0, std::unique_ptr<Class1>(new Class1())));

Или следующим образом:

ObjectArray myMap;
myMap[0] = std::unique_ptr<Class1>(new Class1());

Разница между двумя формами заключается в том, что первая , если ключ 0 уже присутствует на карте, а второй будет перезаписывать его значение новым.

В C ++ 14 вы можете использовать std::make_unique() вместо построения unique_ptr из выражения new. Например:

myMap[0] = std::make_unique<Class1>();
53
ответ дан Jo Liss 20 August 2018 в 23:19
поделиться
  • 1
    +1 для полноты и ясности. – taocp 4 June 2013 в 18:20
  • 2
    @milleniumbug: Хорошее предложение, позвольте мне добавить его к ответу. спасибо – Andy Prowl 4 June 2013 в 18:30
  • 3
    Другим вариантом является элемент emplace: myMap.emplace (0, новый Class1). Однако не все библиотеки поддерживают этот элемент. – Nathan Ernst 5 June 2013 в 00:37
  • 4
    @NathanErnst: Да, хороший совет! – Andy Prowl 5 June 2013 в 09:15
  • 5
    @wgodoy, если вы ссылаетесь на конструктор копирования unique_ptr, нет, он будет ссылаться на оператор присваивания перемещения. – Nathan Ernst 28 October 2016 в 21:40

Если вы хотите добавить существующий указатель для вставки в карту, вам нужно будет использовать std :: move.

Например:

std::unique_ptr<Class1> classPtr(new Class1);

myMap.insert(std::make_pair(0,std::move(classPtr)));
40
ответ дан Maxim Makhun 20 August 2018 в 23:19
поделиться
Другие вопросы по тегам:

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