Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 私有类型说明符是否阻止对象';理解';说明符?_C++_Types_Enums_Private_Access Specifier - Fatal编程技术网

C++ 私有类型说明符是否阻止对象';理解';说明符?

C++ 私有类型说明符是否阻止对象';理解';说明符?,c++,types,enums,private,access-specifier,C++,Types,Enums,Private,Access Specifier,我在获取接受枚举作为返回类型的函数时遇到问题。下面的代码中有一个枚举: Status{ DEAD, WOUNDED, HEALTHY } 以及状态为返回类型的函数: Status getStatus(); 标题代码: class Discovery { public: void doCombat( int ); void setCombatThreshold( int ); void setHealth( int ); void setStatus( int

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

Status{ DEAD, WOUNDED, HEALTHY }
以及状态为返回类型的函数:

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;
    };
}
我找到了这个答案:这让我意识到我真的需要函数的第一行:

Discovery::Status Discovery::getStatus()
但是,我仍然收到头代码的“缺少类型说明符”错误。我意识到在私有访问说明符下声明“enum Status”可能会有所不同,所以我在头代码中将其移动到公共访问说明符。成功了!但是我想解释一下为什么它在私有访问说明符下不起作用。我在别处找到的是:

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

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


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

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


如果计划在类之外使用枚举,则需要将枚举移动到公共范围。

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

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

这可能是真的,但不是问题所在。问题是“为什么第一个失败,为什么第二个成功?”。OP假设它与公共/私有定义有关。这是不正确的。问题是因为status是在public函数之后声明的,这导致了他看到的错误。应该注意的是,如果status不如getStatus()可见,则调用方除了将其传递给Discovery中的另一个函数之外,无法保存、比较它或对其执行任何操作。(其中,没有接受Status的函数,使得getStatus()无法使用。好吧,它没有什么用处,因为它使返回值很难使用,但是在不存储返回值的情况下调用它,或者直接将它传递给具有权限的函数(例如友元函数)是合法的).我不确定我是否会做这样的事,但这是合法的。@Dave,二读时,我发现你对OP的意图是正确的。抱歉和+1。我通过将私人声明置于公开声明之上来测试这一点,它起了作用。好吧,这让我脸红。我不得不想出一些疯狂的理解,事情很简单。谢谢您的帮助。@Nico能够返回私有枚举与枚举是int这一事实无关。我也可以声明私有嵌套类并从公共函数返回。这是允许的,因为私有对象在类声明中可见。但是,除了友元函数之外,没有人能够调用调用公共函数并存储返回值。其他人已经回答了为什么会出现编译错误,但这里还有另一个问题。将
状态
枚举声明为私有,然后将其作为公共函数的返回类型没有任何意义。实例化
发现
类的任何人都不能调用
Discovery::getStatus
,因为返回类型对他们来说是不可访问的。他们可以调用它,但他们唯一能做的就是将它传递给有权访问状态定义的函数。(Discovery或友元函数/类或派生类)此外,getStatus可以简化为
Discovery::Status Discovery::getStatus(){返回charStatus;}