我自学C ++。 我一直在尝试使用枚举变量创建一个类,但它会产生错误。
以下是我编码的一部分。
*将用于Main()
的类#include "Athletics.h"
enum Medal {GOLD, SILVER, BRONZE};
enum Event {100_METER_RACE, POLE_VAULT, HAMMER_THROW};
Athletics::Athletics()
{
}
Athletics::Athletics(Medal medal, Event event)
{
Medal m = medal;
Event e = event;
}
Athletics::Medal getMedal(){// produces an error, "within this context"
return Medal; //produces an error, "expected primary-expression before ';' token"
}
*上面类的标题
#ifndef ATHLETICS_H
#define ATHLETICS_H
class Athletics
{
private:
enum Medal {GOLD, SILVER, BRONZE}; //produces an error, "'enum Athletics::Medal' is private."
enum Event {100_METER_RACE, POLE_VAULT, HAMMER_THROW};
public:
Athletics();
Athletics(Medal medal, Event event);
Medal getMedal();
};
#endif
当我拒绝所有这些枚举和相关构造函数时,一切似乎都很好。
除了getter(Medal getMedal())之外,我还想为枚举变量创建setter方法。
不幸的是,我的教科书显然没有关于这些问题发生的原因的信息。
如果您提供任何建议,我将不胜感激。
答案 0 :(得分:3)
return Medal;
Medal
是enum
本身的名称。您无法返回枚举类型本身。您必须返回特定的枚举对象。
误解可能从你的班级定义开始:
class Athletics
{
// ...
enum Medal {GOLD, SILVER, BRONZE};
};
您似乎认为这会创建该类型的类型和对象。这是错的。它只是声明了一种类型。您需要为您的班级提供对象。如果外部代码应该使用它,您必须公开Medal
。
另一个错误:
Athletics::Medal getMedal() { // ... }
这不是成员函数Athletics::getMedal
的定义,而是新的独立函数getMedal
的定义。
应该是:
Athletics::Medal Athletics::getMedal() {
// ...
}
最后,像100_METER_RACE
这样的标识符会导致编译错误。
以下是您的代码的固定版本:
// athletics.h:
#ifndef ATHLETICS_H
#define ATHLETICS_H
class Athletics
{
public:
enum Medal {GOLD, SILVER, BRONZE};
enum Event {ONE_HUNDRED_METER_RACE, POLE_VAULT, HAMMER_THROW};
Athletics();
Athletics(Medal medal, Event event);
Medal getMedal();
private:
Medal medal;
Event event;
};
#endif
// athletics.cpp:
Athletics::Athletics()
{
}
Athletics::Athletics(Medal medal, Event event) :
medal(medal),
event(event)
{
}
Athletics::Medal Athletics::getMedal() {
return medal;
}
// main.cpp:
int main()
{
Athletics athletics(Athletics::GOLD, Athletics::ONE_HUNDRED_METER_RACE);
}
还有很多事情需要解决,请注意。例如,默认构造函数应该对两个成员变量做什么?
另外两个观察结果:
ALL_CAPS
只应用于预处理器宏。修改强>
您在其中一条评论中提到了Java,并且您最初发布的代码应该在那里工作。我不知道你的意思,因为你的C ++代码大致相当于Java中的以下内容,并产生错误:
class Athletics
{
private static enum Medal { GOLD, SILVER, BRONZE }
public Medal getMedal() {
return this.Medal; // error
}
}
答案 1 :(得分:2)
定义成员函数时,需要告诉编译器它是Athletics
的方法:
Athletics::Medal Athletics::getMedal() { ... }
此外,您不应在实现文件中声明另一个 enum
,并重用Athletics
中的 Athletics::Athletics(Athletics::Medal medal, Athletics::Event event)
。这也意味着更改构造函数的定义:
{{1}}
答案 2 :(得分:2)
我不完全确定您的困惑在哪里,因此修改后的代码版本可能会有所帮助。首先,您必须意识到枚举是类型,就像int
和std::string
一样。定义类型不会定义任何对象;你仍然需要定义自己的对象。
struct Athletics
{
enum Medal { "foo", "bar" }; // defines a type Athletics::Medal
Medal m_; // declares a data member
Medal getMedal() const { return m_; }
Athletics(Medal m) : m_(m) {}
};