将枚举作为参数传递

Passing an enum as a parameter

本文关键字:参数传递 枚举      更新时间:2023-10-16

我有一个Weapon.h/cpp类。它有一个枚举

Weapon.h
enum WEAPONTYPE {
    LASER,
    ROCKET
}

我有一个变量,我想用它来跟踪当前枚举。

WEAPONTYPE currentWeapon;

我有一个函数,它将被调用来更改当前的Weapon值。头文件中的声明是:

void weaponSelect(WEAPONTYPE choice);

.cpp文件中的声明是

void Weapon::weaponSelect(Weapon::WEAPONTYPE enumChoice)
{
    currentWeapon = enumChoice;
}

现在我收到的错误是:

错误C2511:"无效武器::weaponSelect(武器::WEAPONTYPE)":在"武器"中找不到重载的成员函数

感谢您的帮助。

编辑1:


武器.h

#ifndef WEAPON_H_
#define WEAPON_H_
class Weapon
{
public:
    Weapon(Ogre::SceneManager* localManager);
    virtual ~Weapon(void);
    void createBullet(Ogre::Vector3 cameraPosition);        //Create bullet nodes/entities.
    void weaponSelect(WEAPONTYPE enumChoice);                   //Function to select weapon type. Tried to have "WeaponType enumChoice" as parameter but would produce error.
    void updateBullet();                                    //Update bullet logic.
    enum WEAPONTYPE {
        LASER = 0,
        ROCKET = 1
    };
private:
    WEAPONTYPE currentWeapon;               //Enum var to track weapon selected.
    Ogre::SceneManager* localBulletSceneManager;    //Pointer to our application's scene manager
    std::vector<Ogre::SceneNode*>   bullets;        //List of pointers to the bullet nodes.
};
#endif

Weapon.cpp

#include "Weapon.h"
#include <OgreStringConverter.h>
using Ogre::SceneNode;
using Ogre::Entity;
using Ogre::String;
using Ogre::Vector3;
Weapon::Weapon(Ogre::SceneManager* localManager)
: localBulletSceneManager(nullptr)
, currentWeapon(LASER)
{
    this->localBulletSceneManager = localManager;
}
Weapon::~Weapon(void)
{
}
void Weapon::weaponSelect(WEAPONTYPE enumChoice)
{
    this->currentWeapon = enumChoice;
}
void Weapon::createBullet(Vector3 cameraPosition)
{
    //Pointers to use for Quick Node and Entity Creation - Get Reused once object is attached to scene.
    SceneNode* tempNode = nullptr;
    Entity*    tempEntity  = nullptr;
    //All our Objects are spheres, so create one mesh and reuse it with each entity.
    String bulletMesh = "Bullet";
    //Procedural::SphereGenerator().setRadius(1.f).setUTile(5.).setVTile(5.).realizeMesh(bulletMeshName);
    Procedural::ConeGenerator().setRadius(0.5F).setHeight(3.0F).realizeMesh(bulletMesh);
    for (int bulletAmount = 0; bulletAmount < 10; ++bulletAmount)
    {
        tempNode    = this->localBulletSceneManager->getRootSceneNode()->createChildSceneNode("RocketNode" + Ogre::StringConverter::toString(bulletAmount));
        tempEntity  = this->localBulletSceneManager->createEntity("RocketEntity" + Ogre::StringConverter::toString(bulletAmount), bulletMesh);
        //tempEntity->setMaterial(
        tempNode->attachObject(tempEntity);
        tempNode->setPosition(0,0,100 + (bulletAmount * 10));
    }
    switch (this->currentWeapon)
    {
    case LASER:
        break;
    case ROCKET:
        break;
    }
}

编辑2:将.h和.cpp中void weaponSelect的声明还原为原始版本,没有其他海报建议的任何更改。

WEAPONTYPE声明移动到类的顶部:

class Weapon {
public:
    enum WEAPONTYPE {
        LASER = 0,
        ROCKET = 1
    };
    Weapon(Ogre::SceneManager* localManager);
    // ...

错误的原因是当编译器读取以下行时:

void weaponSelect(WEAPONTYPE enumChoice);

它不知道WEAPONTYPE是什么。这是因为enum的声明在类的后面。

此外,我看到您正在使用C++11:使用enum class代替

enum class weapon {
    laser,
    rocket
};

如果WEAPONTYPE在类外声明,请使用以下语法:

void Weapon::weaponSelect(WEAPONTYPE enumChoice)
{
    currentWeapon = enumChoice;
}

如果此枚举是在类中声明的:

void Weapon::weaponSelect(Weapon::WEAPONTYPE enumChoice)
{
    this->currentWeapon = enumChoice;
}

在使用枚举之前必须声明它。

尝试将枚举WEAPONTYPE移动到weaponSelect减速之前另外,我不理解你的API:一方面,您将weaponSelect声明为公共。但是,它的参数是受保护的枚举。你班的cau用户如何使用它?这些都应该具有相同的可访问性/。