Получение объекта с элементом unique_ptr из std::map()

Я пытаюсь получить объект класса (с членом 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()? Спасибо!

честно говоря, вам следует немного притормозить и убедиться, что вы понимаете, что делаете. Уже в ответе на предыдущий вопрос я объяснил, что Cb скопировать нельзя. Вы понимаете, почему нельзя скопировать std::unique_ptr?

463035818_is_not_an_ai 23.08.2024 16:52

Это не имеет смысла, либо карта является владельцем вашего объекта, либо вы. Таким образом, единственная причина иметь карту с unique_ptrs — это карта чисто виртуальных базовых классов. Но что вы действительно хотите сделать? Cb, кажется, намекает на что-то вроде обратного вызова (в этом случае карта std::function может быть более подходящей)

Pepijn Kramer 23.08.2024 17:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

std::unique_ptr нельзя скопировать, поэтому конструктор копирования Cb неявно удаляется компилятором.

Этот код:

Cb ccb = m.at(1);

вызывает конструктор удаленной копии.

Итак, либо вызовите getCa без использования промежуточной переменной:

m.at(1).getCa()

Или измените переменную на ссылку:

Cb& ccb = m.at(1);

В любом случае копировать объект Cb не нужно.

Другие вопросы по теме