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)

我不完全确定您的困惑在哪里,所以也许更正后的代码版本会有所帮助。首先,您必须意识到枚举是 类型 ,就像 intstd::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;

Medalenum 本身的名称。您不能 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);
}

请注意,还有很多事情需要解决。比如默认构造函数应该怎么处理这两个成员变量?

另外两个观察结果:


编辑:

您在您的一条评论中提到了 Java,并且您最初发布的此类代码应该可以在那里工作。我不知道你的意思,因为你的 C++ 代码大致相当于 Java 中的以下内容,并且也会产生错误:

class Athletics
{
    private static enum Medal { GOLD, SILVER, BRONZE }

    public Medal getMedal() {
        return this.Medal; // error
    }
}