3

我在获取一个接受枚举作为返回类型的函数时遇到了问题。在下面的代码中有一个枚举:

Status{ DEAD, WOUNDED, HEALTHY }

以及一个以 Status 作为返回类型的函数:

Status getStatus();

标头代码:

class Discovery
{
public:
    void doCombat( int );
    void setCombatThreshold( int );
    void setHealth( int );
    void setStatus( int );
    Status getStatus();
private:
    enum Status { DEAD, WOUNDED, HEALTHY };
    Status charStatus;
    int yourHealth;
    int combatThreshold;
};

最初相关的函数定义为:

Status Discovery::getStatus()
{
    switch ( charStatus )
    {
    case DEAD:
        return DEAD;
        break;
    case WOUNDED:
        return WOUNDED;
        break;
    case HEALTHY:
        return HEALTHY;
        break;
    };
}

我找到了这个答案:从 C++ 基类中的函数返回枚举,这帮助我意识到我真的需要读取函数的第一行:

Discovery::Status Discovery::getStatus()

但是,我的标头代码仍然收到“缺少类型说明符”错误。我意识到在私有访问说明符下拥有我的“枚举状态”声明可能会有所不同,因此我将其移至我的标头代码中的公共访问说明符。有效!但我想解释一下为什么它在私有访问说明符下不起作用。我设法在其他地方找到的是:

类的对象不能访问私有数据成员。

我对发生的事情的解释是——使用私有访问说明符下的枚举类型定义,函数(以及最终调用该函数的对象)不可能访问“理解”我的枚举类型,因此接受它作为返回类型。

但是 - 如果是这样的话,为什么我可以返回在私有访问说明符下声明的变量,但存在同样的问题?是不是因为它们的类型在其他地方已经被理解了,所以程序接受它们没有问题?

4

2 回答 2

4

状态是在使用后定义的。在 get 方法之前将状态上移。

如果您打算在类之外使用枚举,则需要将枚举移至公共范围。

于 2011-08-05T20:11:27.163 回答
4

您需要更改声明的顺序。由于您在声明之前使用 Status,因此它会给您一个错误。您必须将状态声明上移。

class Discovery
{
private:
    enum Status { DEAD, WOUNDED, HEALTHY };
public:
    void doCombat( int );
    void setCombatThreshold( int );
    void setHealth( int );
    void setStatus( int );
    Status getStatus();
private:
    Status charStatus;
    int yourHealth;
    int combatThreshold;
};
于 2011-08-05T20:12:21.997 回答