Я пытаюсь получить объект класса (с членом unique_ptr
) из std::map (ранее заполненного), и возникает ошибка. Вот код:
классы.hpp
#ifndef CLASSMETHODNOTCALLED_CLASSES_HPP
#define CLASSMETHODNOTCALLED_CLASSES_HPP
#include "iostream"
#include "memory"
// tow classes with one pointing to the other
class Ca
{
int m_va = 5;
public:
Ca();
int getVa();
};
class Cb
{
std::unique_ptr<Ca> m_x; // a smart ptr pointing to class Ca
int m_vb;
public:
explicit Cb(int n);
~Cb();
int getCa();
};
#endif //CLASSMETHODNOTCALLED_CLASSES_HPP
классы.cpp
#include "../include/classes.hpp"
#include "memory"
// Ca
Ca::Ca()
{
}
int Ca::getVa()
{
return m_va;
};
// Cb
Cb::Cb(int n)
{
m_x = std::make_unique<Ca>();
m_vb = n;
}
Cb::~Cb()
{
}
int Cb::getCa()
{
return m_x->getVa() + m_vb; // returns 5 + 1 = 6 if works properly
}
main.cpp
#include <iostream>
#include "include/classes.hpp"
#include "map"
int main()
{
Cb cb(1); // instanciate Cb
std::map<int, Cb> m;
m.emplace(1, std::move(cb));
Cb ccb = m.at(1); // error occurs here complaining about: call to implicitly deleted copy constructor
int i = ccb.getCa();
std::cout << "m_va = " << i << std::endl;
}
Ошибка возникает в файле main.cpp, и компилятор жалуется на «вызов неявно удаленного конструктора копирования» в строке
Cb ccb = m.at(1);
Мой вопрос: как в этом случае получить объект cb
из ранее заполненного std::map()
? Спасибо!
Это не имеет смысла, либо карта является владельцем вашего объекта, либо вы. Таким образом, единственная причина иметь карту с unique_ptrs — это карта чисто виртуальных базовых классов. Но что вы действительно хотите сделать? Cb
, кажется, намекает на что-то вроде обратного вызова (в этом случае карта std::function может быть более подходящей)
std::unique_ptr
нельзя скопировать, поэтому конструктор копирования Cb
неявно удаляется компилятором.
Этот код:
Cb ccb = m.at(1);
вызывает конструктор удаленной копии.
Итак, либо вызовите getCa
без использования промежуточной переменной:
m.at(1).getCa()
Или измените переменную на ссылку:
Cb& ccb = m.at(1);
В любом случае копировать объект Cb
не нужно.
честно говоря, вам следует немного притормозить и убедиться, что вы понимаете, что делаете. Уже в ответе на предыдущий вопрос я объяснил, что
Cb
скопировать нельзя. Вы понимаете, почему нельзя скопироватьstd::unique_ptr
?