C ++ Вставка класса в контейнер карты

C ++ позволяет статическим членам константы быть определенными внутри класса

Нет, 3.1 §2 говорит:

Объявление - это определение если он не объявляет функцию без указания тела функции (8.4), он содержит спецификатор extern (7.1.1) или спецификацию привязки (7.5), а также ни инициализатор, ни функция, он объявляет статический член данных в определении класса (9.4), это объявление имени класса (9.1), это непрозрачная-enum-декларация (7.2), или это объявление typedef (7.1.3), использование-декларация (7.3.3) или using-директива (7.3.4).

13
задан Fouf 18 February 2010 в 00:29
поделиться

3 ответа

Во-первых, не храните сами объекты на карте, сохраняйте указатели на свои объекты.

Во-вторых, вам нужно передать экземпляр Scene_Branding в std :: make_pair, а не сам класс.

РЕДАКТИРОВАТЬ: Вот как вы собираетесь хранить указатели:

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

Но, поскольку вы задали этот тип вопросов, я рекомендую вам прочитать хорошую книгу по C ++ для дальнейшего понимания таких понятий, как указатели.

26
ответ дан 1 December 2019 в 07:19
поделиться

Попробуйте:

Scenes.insert(std::make_pair("Scene_Branding", Scene_Branding()));
8
ответ дан 1 December 2019 в 07:19
поделиться

Я думаю, вы не хотите этого делать.

  1. в C ++ нет отображения типов во время выполнения, вы храните объекты, а не типы.
  2. вы не можете хранить полиморфные типы в контейнерах STL, используйте вместо этого boost :: ptr_map , если хотите.

Итак, «новый» код:

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 '->'

Хорошая особенность Контейнера указателя повышения заключается в том, что он предназначен для полиморфных типов, с безопасностью исключений и всем остальным, и все же имитирует поведение / интерфейс STL, чтобы вы не заблудились :)

3
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: