首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++将类插入到映射容器中

C++将类插入到映射容器中
EN

Stack Overflow用户
提问于 2010-02-17 22:29:12
回答 4查看 53.9K关注 0票数 17

我在C++中有一个映射,我希望输入我的类作为值,输入一个字符串作为键。当我尝试这样做时,我得到了一个错误'Scene_Branding' : illegal use of this type as an expression我得到了一个非法使用这个类型作为表达式,我似乎找不到原因。下面是一些代码。

代码语言:javascript
复制
 string CurrentScene = "Scene_Branding";
 map<string, Scene> Scenes;
 Scenes.insert(std::make_pair("Scene_Branding", Scene_Branding));  //<-- Illegal Error parameter 2

这是Scene Branding标题。

代码语言:javascript
复制
#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

这是场景标题..

代码语言:javascript
复制
#ifndef Scene_H
#define Scene_H

#include <iostream>
#include <string>

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

};

#endif

这是cpp文件。

场景cpp。

代码语言:javascript
复制
#include "Scene.h"

Scene::Scene()
{

}
Scene::~Scene()
{

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

Scene_Branding cpp

代码语言:javascript
复制
#include "Scene_Branding.h"

Scene_Branding::Scene_Branding()
{

}

Scene_Branding::~Scene_Branding()
{

}

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

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-17 22:34:39

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

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

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

代码语言:javascript
复制
 string CurrentScene = "Scene_Branding";
 map<string, Scene*> Scenes;
 Scenes.insert(std::make_pair("Scene_Branding", new Scene_Branding()));

但是,既然您提出了这种类型的问题,我建议您阅读一本好的c++书籍,以便进一步掌握指针等概念。

票数 33
EN

Stack Overflow用户

发布于 2010-02-17 22:36:12

尝试:

代码语言:javascript
复制
Scenes.insert(std::make_pair("Scene_Branding", Scene_Branding()));
票数 9
EN

Stack Overflow用户

发布于 2010-02-17 22:58:53

我想你不会想这么做的。

  1. C++中没有运行时类型映射,您存储的是对象,而不是类型。
  2. 您不能将多态类型存储在STL容器中,如果您希望使用boost::ptr_map

,请改用它

所以,“新”代码:

代码语言:javascript
复制
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(); }
};

以及存储这些数据的新方法:

代码语言:javascript
复制
const std::string SceneBrandingKey = "Scene_Branding";

typedef boost::ptr_map<std::string, Scene> scenes_type;

scenes_type Scenes;
Scenes.insert(SceneBrandingKey, new Scene_Branding());

你可以这样使用它:

代码语言:javascript
复制
Scenes["Scene_Branding"].process(); // Note: use '.' not '->'

关于Boost Pointer Container的好处是,它是为多态类型设计的,具有异常安全性和所有功能,但它模仿了STL的行为/接口,这样您就不会迷失方向了:)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2281420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档