2016-03-01 3 views
0

Я пытаюсь создать карту, содержащую объекты с разными аргументами.Создайте карту объектов без разрушения объектов

Но я обнаружил, что после вставки пары объект будет уничтожен.

Если я пытаюсь использовать функцию в этом object.For Например:

#include <map> 
#include <iostream> 

class Test{ 
    public: 
     Test(double value) : value_(value){} 
     ~Test(){std::cout<< "destroyed";} 
     void plusone() {value_ += 1;} 
    private: 
     double value_; 
}; 

int main(){ 
    std::map<long, Test> map; 

    map.insert(std::make_pair(1, Test(1.2))); 
    map[1].plusone(); 
    return 0; 
} 

Он покажет: [Error] без функции согласования для вызова 'Class :: Class()'

[примечание] кандидат ожидает 1 аргумент, 0 предоставлено

Как это сделать?

+0

В вашем случае кажется, что вы можете использовать 'map :: at' (throw if not found) вместо' map :: operator [] '(попробуйте вставить объект по умолчанию и вернуть вставленный/найденный объект). – Jarod42

ответ

1

Синтаксис map[1] может использоваться только в том случае, если сопоставленный тип имеет конструктор по умолчанию. Это связано с тем, что если ключ не найден, объект, построенный по умолчанию, вставлен, но компилятор должен сгенерировать код для этого во время компиляции.

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

auto it = map.find(1); 
if (it != map.end()) 
    it->second.memberfuncion(); 

Кроме того, ваше сообщение об ошибке не имеет ничего общего с разрушающими предметами, так как ваше название упоминается.


В коде map.insert(std::make_pair(1, Class(argument)));, создается временный объект Class(argument) и скопируйте его на карту. Затем временный объект уничтожается.

Если вы хотите этого избежать и построить непосредственно на карте, используйте map.emplace(1, argument);.

+0

Обратите внимание, что 'emplace()' доступно только в C++ 11 и более поздних версиях. –

+0

большое спасибо, очень подробно описание. Кстати, какой из них вы предпочитаете? синтаксис [] или .find – CHOCOLEO

+0

да, в C++ 03 нет возможности, но чтобы скопировать объект в –

Смежные вопросы