C ++将类插入到地图容器中

时间:2010-02-17 14:29:12

标签: c++ class inheritance map

我有一个C ++地图,我希望输入我的类作为值,并输入一个字符串作为键。 当我尝试时,我收到错误'Scene_Branding' : illegal use of this type as an expression 我非法使用这种类型作为表达式,我似乎无法找出原因。这是一些代码。

 string CurrentScene = "Scene_Branding";
 map<string, Scene> Scenes;
 Scenes.insert(std::make_pair("Scene_Branding", Scene_Branding));  //<-- Illegal Error parameter 2

这里是场景品牌标题..

#ifndef Scene_Branding_H
#define Scene_Branding_H

#include "Scene.h"
#include <iostream>
#include <string>


class Scene_Branding : Scene
{
public:
 Scene_Branding();
 ~Scene_Branding();
 void Draw();
};

#endif

这里是Scene标题..

#ifndef Scene_H
#define Scene_H

#include <iostream>
#include <string>

class Scene
{
public:
 Scene();
 ~Scene();
 virtual void Draw();

};

#endif

这里有cpp文件。

场景cpp。

#include "Scene.h"

Scene::Scene()
{

}
Scene::~Scene()
{

}
void Scene::Draw(){
 std::cout << "Hey";
}

Scene_Branding cpp

#include "Scene_Branding.h"

Scene_Branding::Scene_Branding()
{

}

Scene_Branding::~Scene_Branding()
{

}

void Scene_Branding::Draw()
{
 std::cout << "Drawing from Scene_branding";
}

4 个答案:

答案 0 :(得分:22)

首先,不要将对象本身存储在地图中,存储指向对象的指针。

其次,您需要将一个Scene_Branding实例提供给std :: make_pair,而不是类本身。

编辑: 以下是存储指针的方法:

 string CurrentScene = "Scene_Branding";
 map<string, Scene*> Scenes;
 Scenes.insert(std::make_pair("Scene_Branding", new Scene_Branding()));

但是,既然你问过这类问题,我建议你阅读一本很好的c ++书籍,以便进一步掌握指针等概念。

答案 1 :(得分:7)

尝试:

Scenes.insert(std::make_pair("Scene_Branding", Scene_Branding()));

答案 2 :(得分:3)

我认为你不想这样做。

  1. 在C ++中没有运行时类型映射,您存储对象,而不是类型。
  2. 您无法在STL容器中存储多态类型,如果您愿意,请使用boost::ptr_map
  3. 所以,“新”代码:

    class Scene
    {
    public:
      virtual ~Scene();                  // Virtual Destructor, it's a base class
      virtual Scene* clone() const = 0;  // Polymorphic construction
    private:
      // whatever you wish
    };
    
    class Scene_Branding: public Scene
    {
    public:
      virtual Scene_Branding* clone() const { return new Scene_Branding(); }
    };
    

    存储这些的新方法:

    const std::string SceneBrandingKey = "Scene_Branding";
    
    typedef boost::ptr_map<std::string, Scene> scenes_type;
    
    scenes_type Scenes;
    Scenes.insert(SceneBrandingKey, new Scene_Branding());
    

    你可以这样使用它:

    Scenes["Scene_Branding"].process(); // Note: use '.' not '->'
    

    关于Boost Pointer Container的好处是,它的意思是多态类型,具有异常安全性和所有,并且模仿STL的行为/接口,以便您不会丢失:)

答案 3 :(得分:0)

在使用通用映射容器时,你需要在类中使用指针,结果可能是一个没有类的新对象...指针有效!

std::map<std::string, Type*> map_;

插入

map_["key"] = *Type;

注意:如果未设置编译器的-fpermisive标志,则在map_容器中插入时需要传递* Type not const。

最诚挚的问候,

哈维尔,