私有类型说明符是否阻止对象“理解”说明符?

时间:2011-08-05 20:04:31

标签: c++ types enums private access-specifier

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

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;
    };
}

我找到了这个答案:returning enum from function in C++ base class帮助我意识到我真的需要该函数的第一行来阅读:

Discovery::Status Discovery::getStatus()

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

该类的对象无法访问私有数据成员。

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

但是 - 如果是这种情况,为什么我允许返回在私有访问说明符下声明的变量具有相同的问题?是因为他们的类型已经在其他地方被理解了,所以程序接受它们没有问题吗?

2 个答案:

答案 0 :(得分:4)

状态在使用后定义。在get方法之前向上移动状态。

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

答案 1 :(得分: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;
};