【问题标题】:Private enum with public overloaded constructor具有公共重载构造函数的私有枚举
【发布时间】:2016-02-28 03:35:25
【问题描述】:

我在让重载的构造函数工作时遇到问题。不断收到一个问题,说只有一个复制构造函数和析构函数。我应该使用私有枚举技术,因此使用setWeaponSword()(最后四个函数)之类的成员函数。

这是我的班级声明:

class Knight{

public:
    enum Race{ ALTMER, IMPERIAL, KHAJIIT };
    Knight(Race newRace, short int newHealth, short int newStamina, Weapon newWeapon);
    Knight(const Knight &copiedKnight);
    ~Knight();
    void setRace(const Race newRace);
    Race getRace();
    void setHealth(const short int newHealth);
    short int getHealth();
    void setStamina(const short int newStamina);
    short int getStamina();
    void setWeaponBow();
    bool isWeaponBow();
    void setWeaponSword();
    bool isWeaponSword();
private:
    enum Weapon { BOW , SWORD};
    Race race;
    short int health;
    short int stamina;
    Weapon weapon;
};

这是它的简单成员函数文件:

//Defualt values for variables Needed


 Knight::Knight(Race newRace, short int newHealth, short int newStamina, Weapon newWeapon) : newRace(IMPERIAL), newHealth(50), newStamina(35), newWeapon(SWORD)
{
    setRace(newRace);
    setHealth(newHealth);
    setStamina(newStamina);
}

我的思考过程是。如果找不到,我无法在 main 中传递 Weapon。这就是为什么我认为我必须使用班级中的最后四个函数来操作数据以获取它。我不知道怎么做。请告诉我一些基本知识。

【问题讨论】:

  • 什么是错误,它发生在哪里?此外,让一个复制 ctor 通过非常量引用来获取它是很奇怪的。
  • 也许您的编译器知道 Skyrim 属于 Nords,并且在您包含它们之前完全拒绝编译您的程序。
  • @JamesRoot 发生在我的重载构造函数的类声明中。
  • 创建一个minimal reproducible example,其中仅包含重现错误所需的代码。

标签: c++ oop enums private


【解决方案1】:

我建议这样做作为开始:

private:
    enum Weapon { NO_WEAPON, BOW , SWORD};
    Race race;
    short int health;
    short int stamina;
    Weapon weapon{NO_WEAPON};

然后,您不需要将武器传递给构造函数。该类将默认为 NO_WEAPON,直到您拥有一个。

考虑删除其他参数并用默认值替换它们。采用一堆 int 的构造函数可能容易出错。

编辑:如果您使用的是较旧的编译器,则不能将 {NO_WEAPON} 放入类中。相反,您必须在构造函数中对其进行初始化:

     Knight::Knight(........) : weapon(NO_WEAPON)
     { ...

【讨论】:

  • 所以我编辑了我的构造函数,我知道它不知道我的类文件中的数据类型weapon。
猜你喜欢
  • 2011-10-30
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 2011-02-08
  • 2017-04-30
  • 1970-01-01
相关资源
最近更新 更多