【问题标题】:Issues with adding to vectors with enums使用枚举添加到向量的问题
【发布时间】:2016-08-12 04:01:01
【问题描述】:

我最近在制作 C++11/SDL 游戏引擎时遇到了困难,我可以参考一些建议。 理想情况下,我想做的是:

  1. 创建表示要添加到 spritebank 的所有 sprite 的枚举
  2. 创建文件名向量,并使用枚举将每个文件名添加到向量中
  3. 遍历所有加载的文件名,并使用枚举创建具有特定属性的精灵

但是第二步(files.emplace() 函数)给出these errors,第三步(switch(sprite_file))根据我使用this->sprite_filesprite_file 给出不同的错误。关于如何使这个想法发挥作用的任何想法?我使用的代码如下(如果缺少任何信息,请随意说)

//abstracted application class that starts the program//
std::vector<std::string> files;

class App : public Event
{
    private:
        bool Running; //Running flag

        enum sprite_file
        {
            SPRITE_RING1 = 0,
            SPRITE_RING2 = 1,
            SPRITE_END = 2
        };

        SDL_Window* graphicsWindow; //The window
        SDL_Renderer* graphicsRenderer; //The renderer
        TTF_Font* globalFont; //The global font

        Timer capTimer; //Frames per second cap timer

        SpriteBank rings; //Collection of sprites
        std::string currentSprite; //Filename of sprite in use
[...]
//abstracted initialization function within App//
//Initialize spritebank
   if(!rings.Init(graphicsRenderer))
   {
      printf("Failed to load sprites!");
   }

   //Add two sprites
   files.emplace(SPRITE_RING1, "media/img/ring/ring1.png");
   files.emplace(SPRITE_RING2, "media/img/ring/ring2.png");

   //Add two sprites
   for(auto filename : files)
   {
      switch(this->sprite_file)
      {
         case SPRITE_RING1:
         {
            rings.AddSprite(filename,
                        40,
                        40,
                        40,
                        20,
                        20);
            break;
         }

         case SPRITE_RING2:
         {
            rings.AddSprite(filename,
                        40,
                        40,
                        40,
                        20,
                        20);
            break;
         }
         default: continue; break;
      }
   }

   currentSprite = SPRITE_RING1;

【问题讨论】:

  • 请不要发布您的错误截图。复制“n”将错误粘贴到您的问题中。
  • 你到底想用files.emplace(SPRITE_RING1, "media/img/ring/ring1.png");做什么?您基本上是将枚举和字符串文字传递给std::string 的构造函数。你期望std::string 的构造函数对这两个参数做什么?

标签: c++ c++11 vector enums


【解决方案1】:

两个明显的问题:

std::vector 不像std::map 那样工作。即使这样,我也不确定您是否拥有超过这 3 个枚举元素。也许您想在向量内部使用结构?

您也不能切换enums 声明名称。你必须切换一个具有枚举值的变量才能进入切换,并且能够编译。

//example:
sprite_file myVar = SPRITE_RING1;
switch (myVar)
{
    //...
}

您也不能将枚举的整数值分配给std::string

currentSprite = SPRITE_RING1

最简单的方法是创建另一个枚举类型的变量。

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 2015-03-24
    • 2020-05-11
    • 1970-01-01
    • 2013-01-10
    • 2011-08-17
    • 2020-12-24
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多