c ++使用枚举创建class会产生错误
c++ Creating a class with a enum produces errors
我正在自学 C++。
我一直在尝试使用枚举变量创建 class,但它会产生错误。
这是我的部分编码。
*A class 将用于 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"
}
*上面class的表头
#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 方法。
不幸的是,我的教科书显然没有关于为什么会发生这些问题的信息。
如果您能提供任何建议,我将不胜感激。
定义成员函数时,需要告诉编译器它是Athletics
:
的一个方法
Athletics::Medal Athletics::getMedal() { ... }
此外,你不应该在实现文件中声明另一个 enum
,重用Athletics
中的那个。这也意味着改变构造函数的定义:
Athletics::Athletics(Athletics::Medal medal, Athletics::Event event)
我不完全确定您的困惑在哪里,所以也许更正后的代码版本会有所帮助。首先,您必须意识到枚举是 类型 ,就像 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) {}
};
return Medal;
Medal
是 enum
本身的名称。您不能 return 枚举类型本身。您必须 return 一个特定的枚举 object.
误会大概是从你的class定义开始的:
class Athletics
{
// ...
enum Medal {GOLD, SILVER, BRONZE};
};
您似乎认为这会同时创建类型和该类型的对象。这是错误的。它只是声明一个类型。你需要给你的class一个对象。如果外部代码应该使用它,你必须制作 Medal
public。
另一个错误:
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);
}
请注意,还有很多事情需要解决。比如默认构造函数应该怎么处理这两个成员变量?
另外两个观察结果:
- 你应该更喜欢C++11 enum classes.
ALL_CAPS
只能用于预处理器宏。
编辑:
您在您的一条评论中提到了 Java,并且您最初发布的此类代码应该可以在那里工作。我不知道你的意思,因为你的 C++ 代码大致相当于 Java 中的以下内容,并且也会产生错误:
class Athletics
{
private static enum Medal { GOLD, SILVER, BRONZE }
public Medal getMedal() {
return this.Medal; // error
}
}
我正在自学 C++。 我一直在尝试使用枚举变量创建 class,但它会产生错误。
这是我的部分编码。
*A class 将用于 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"
}
*上面class的表头
#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 方法。
不幸的是,我的教科书显然没有关于为什么会发生这些问题的信息。
如果您能提供任何建议,我将不胜感激。
定义成员函数时,需要告诉编译器它是Athletics
:
Athletics::Medal Athletics::getMedal() { ... }
此外,你不应该在实现文件中声明另一个 enum
,重用Athletics
中的那个。这也意味着改变构造函数的定义:
Athletics::Athletics(Athletics::Medal medal, Athletics::Event event)
我不完全确定您的困惑在哪里,所以也许更正后的代码版本会有所帮助。首先,您必须意识到枚举是 类型 ,就像 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) {}
};
return Medal;
Medal
是 enum
本身的名称。您不能 return 枚举类型本身。您必须 return 一个特定的枚举 object.
误会大概是从你的class定义开始的:
class Athletics
{
// ...
enum Medal {GOLD, SILVER, BRONZE};
};
您似乎认为这会同时创建类型和该类型的对象。这是错误的。它只是声明一个类型。你需要给你的class一个对象。如果外部代码应该使用它,你必须制作 Medal
public。
另一个错误:
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);
}
请注意,还有很多事情需要解决。比如默认构造函数应该怎么处理这两个成员变量?
另外两个观察结果:
- 你应该更喜欢C++11 enum classes.
ALL_CAPS
只能用于预处理器宏。
编辑:
您在您的一条评论中提到了 Java,并且您最初发布的此类代码应该可以在那里工作。我不知道你的意思,因为你的 C++ 代码大致相当于 Java 中的以下内容,并且也会产生错误:
class Athletics
{
private static enum Medal { GOLD, SILVER, BRONZE }
public Medal getMedal() {
return this.Medal; // error
}
}