我想将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;
}
}
答案 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的原因。