加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 你能创建一个继承类的std :: map吗?

发布时间:2020-12-16 09:39:29 所属栏目:百科 来源:网络整理
导读:我想知道是否可以创建一个继承类指针的映射.这是我正在尝试做的一个例子: #include string#include mapusing namespace std;class BaseClass{ string s;};class Derived1 : public BaseClass{ int i;};class Derived2 : public Derived1{ float f;};// Here
我想知道是否可以创建一个继承类指针的映射.这是我正在尝试做的一个例子:

#include <string>
#include <map>

using namespace std;

class BaseClass
{
    string s;
};

class Derived1 : public BaseClass
{
    int i;
};

class Derived2 : public Derived1
{
    float f;
};

// Here's what I was trying,but isn't working
template<class myClass>
map<string,myClass>m;

int main()
{
    // Add BaseClasses,Derived1's,and/or Derived2's to m here
    return 0;
}

我得到的错误是:

main.cpp(23): error C2133: 'm' : unknown size
main.cpp(23): error C2998: 'std::map<std::string,myClass>m' : cannot be a template definition

我明白为什么我会收到这个错误,但我想知道是否可以创建一个可以容纳不同级别的继承类的地图?如果没有,是否有可能创建一种可以容纳各种类型的管理系统?或者我是否必须制作不同的地图/矢量/数组/等.对于每种类型的课程?

解决方法

是的,您可以在地图中存储继承的类,但指向它们,而不是对象本身.这是一个简短的例子(缺少对指针的内存管理)

#include <iostream>
#include <string>
#include <map>
#include <utility>

using namespace std;

class BaseClass
{
    string s;
public: 
    BaseClass() { s = "BaseClass";} 
    virtual void print() 
    {
        cout << s << std::endl;
    }
};

class Derived1 : public BaseClass
{
    int i;
public:
    Derived1() { i = 10; }
    void print() 
    {
        cout << i << std::endl;
    }

};

class Derived2 : public Derived1
{
    float f;
public:
    Derived2() { f = 4.3;}
    void print() 
    {
        cout << f << std::endl;
    }
};

int main()
{
    map<string,BaseClass*>m;
    m.insert(make_pair("base",new BaseClass()));
    m.insert(make_pair("d1",new Derived1()));
    m.insert(make_pair("d2",new Derived2()));
    m["base"]->print();
    m["d1"]->print();
    m["d2"]->print();

    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读