为什么我不能将shared_ptr <derived>添加到map <key_type,shared_ptr <base>&gt;在这段代码中?</key_type,shared_ptr <base> </derived>

时间:2015-02-24 14:43:57

标签: c++ inheritance

我想将shared_ptr<derived>添加到包含shared_ptr<base>值的地图(如下http://ideone.com/hd68yc),但它失败了(我们到达EXIT_FAILURE):

#include <iostream>
#include <map>
#include <memory>
using namespace std;

class base{
    public:
        base(const int& s = 1):setting{s}{};
        int setting;
};
class derived : public base{
    public:
        derived(const int& s):setting{s}{};
        int setting;
};

int main() {
    map<string,shared_ptr<base>> m_s;
    m_s.insert(make_pair("Name",make_shared<derived>(4)));
    // None of these worked either...
    //m_s.emplace("Name",make_shared<derived>(4));
    //m_s["Name"] = make_shared<derived>(4);

    if(4 == m_s.at("Name")->setting){
        return EXIT_SUCCESS;
    }else{
        cout << "setting is " << m_s.at("Name")->setting << " when 4 expected";
        return EXIT_FAILURE;
    }
}

3 个答案:

答案 0 :(得分:1)

您无法在构造函数初始化列表中初始化基类成员,但您可以调用正确的基类构造函数:

class derived : public base{
    public:
        derived(const int& s):base{s}{};
};

你天真的&#34;修复&#34;将成员setting放入派生类并不能解决问题,但隐藏它,允许代码编译,但打破逻辑。

答案 1 :(得分:-1)

首先,派生类包含一个额外的setting成员。摆脱这一点揭示了我不能使用derived(const int& s):setting{s}{}; ctor语法,因为它引用了一个继承的setting成员。

最后,使用以下解决了我的问题:

class correct_derived : public base{
    public:
        correct_derived(const int& s){
            setting = s;
        }
};

答案 2 :(得分:-1)

m_s.insert(make_pair("Name",make_shared<derived>(4)));

if(4 == m_s.at("Name")->setting) {

据我所知,你可以将指针存储在地图中,然后将其与int(4)进行比较。您必须取消引用存储的共享指针以获取其值,然后您可以将其与“4”进行比较。这可能是你最终选择EXIT_FAILURE的原因。