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

Fou*_*ouf 14 c++ inheritance class 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
Run Code Online (Sandbox Code Playgroud)

这里是场景品牌标题..

#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
Run Code Online (Sandbox Code Playgroud)

这里是场景标题..

#ifndef Scene_H
#define Scene_H

#include <iostream>
#include <string>

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

};

#endif
Run Code Online (Sandbox Code Playgroud)

这里有cpp文件.

场景cpp.

#include "Scene.h"

Scene::Scene()
{

}
Scene::~Scene()
{

}
void Scene::Draw(){
 std::cout << "Hey";
}
Run Code Online (Sandbox Code Playgroud)

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";
}
Run Code Online (Sandbox Code Playgroud)

ere*_*der 26

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

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

编辑:这是你如何存储指针:

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

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

  • 只要对象的类是最终的,存储对象就可以了. (7认同)

Ale*_*ler 8

尝试:

Scenes.insert(std::make_pair("Scene_Branding", Scene_Branding()));
Run Code Online (Sandbox Code Playgroud)

  • 这是因为场景的实例存储在地图中,而不是Scene_Branding的实例。这称为对象切片,短暂地它会导致您丢失在Scene_Branding中声明的信息。存储指针不会导致此问题。 (2认同)