c ++使用枚举创建一个类会产生错误

时间:2015-03-14 12:50:43

标签: c++ class constructor enums nested

我自学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方法。

不幸的是,我的教科书显然没有关于这些问题发生的原因的信息。

如果您提供任何建议,我将不胜感激。

3 个答案:

答案 0 :(得分:3)

return Medal;

Medalenum本身的名称。您无法返回枚举类型本身。您必须返回特定的枚举对象

误解可能从你的班级定义开始:

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

还有很多事情需要解决,请注意。例如,默认构造函数应该对两个成员变量做什么?

另外两个观察结果:


修改

您在其中一条评论中提到了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)

我不完全确定您的困惑在哪里,因此修改后的代码版本可能会有所帮助。首先,您必须意识到枚举是类型,就像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) {}
};