【发布时间】:2011-10-21 04:16:12
【问题描述】:
我在获取一个接受枚举作为返回类型的函数时遇到了问题。在下面的代码中有一个枚举:
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()
但是,我的标头代码仍然收到“缺少类型说明符”错误。我意识到在私有访问说明符下使用我的“枚举状态”声明可能会有所不同,因此我将其移至我的标头代码中的公共访问说明符。有效!但我想解释一下为什么它在私有访问说明符下不起作用。我设法在其他地方找到的是:
类的对象不能访问私有数据成员。
我对发生的事情的解释是——使用私有访问说明符下的枚举类型定义,函数(以及最终调用该函数的对象)不可能访问“理解”我的枚举类型,因此接受它作为返回类型。
但是 - 如果是这样的话,为什么我可以返回在私有访问说明符下声明的变量,但存在同样的问题?是不是因为它们的类型已经在别处被理解了,所以程序接受它们没有问题?
【问题讨论】:
-
其他人已经回答了为什么您遇到编译错误,但这里还有另一个问题。将
Status枚举声明为私有然后将其作为公共函数的返回类型没有任何意义。实例化Discovery类的任何人都不能调用Discovery::getStatus,因为他们无法访问返回类型。 -
他们可以调用它,但他们唯一能做的就是将它传递给可以访问状态定义的函数。 (发现或友元函数/类,或派生类)
-
另外,getStatus 可以简化为
Discovery::Status Discovery::getStatus() {return charStatus;}
标签: c++ types enums private access-specifier