从 std::map() 获取具有 unique_ptr 成员的对象

问题描述 投票:0回答:1

我试图从 std::map (之前填充的)获取一个类对象(带有

unique_ptr
成员),并且发生错误。这是代码:

classes.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()
对象?谢谢!

c++ class constructor smart-pointers stdmap
1个回答
0
投票

这段代码

Cb ccb = m.at(1);

调用已删除的复制构造函数。因此,要么调用

getCa
而不使用中间变量

m.at(1).getCa()

或将变量更改为引用

Cb& ccb = m.at(1);

无论哪种方式,都不需要复制

Cb
对象。

© www.soinside.com 2019 - 2024. All rights reserved.