在C ++中实现枚举类型

时间:2014-11-22 18:24:04

标签: c++ enums

所以我正在尝试创建一个枚举类的类,除了我以前从未使用过enum类型和im在学习过程中。据我所知,枚举类型基本上是enum a(red, blue green);,其中红色= 0,蓝色= 1,绿色= 2。但从那里我不太明白如何进一步实现这个枚举类。如果我有一个标题类,如

#ifndef COLOR_H
#define COLOR_H


class Color
{
    public:
        enum Color {red, blue, green};
};

#endif // COLOR_H

然后是一个cpp文件,如下所示:

#include "Color.h"

enum Color::Color {red, blue, green}{
 //dont know how to implement in here
}

如何实现成员函数,以便如果Color从main.cpp传递1,那么成员函数会打印出蓝色吗?

4 个答案:

答案 0 :(得分:2)

不需要“枚举实现”(无论对您来说意味着什么)。你可以简单地拥有:

struct Color {
    enum ColorInternal {red, blue, green};
};

并将枚举值作为Color::redColor::blueColor::green和枚举Color::ColorInternal进行访问。

或者,您只需使用enum class

即可
enum class Color {red, blue, green};

并将值设为Color::red,将类视为Color

答案 1 :(得分:0)

不需要在.cpp文件中实现 - 标题中的内容就足够了。顺便说一句,你实际上并不需要一个班级来保持一个枚举。简单地写enum Color {Red, Blue, Green};就足够了。

您可以将其视为一种更清晰的写作方式:

#define Red 0
#define Blue 1
#define Green 2
#define Color int

有几个基本的区别,但关键是这也可以写在.h文件中。当然,你永远不应该使用上面的例子,这是一种可怕的编程习惯。

答案 2 :(得分:0)

这是另一种方式:

#include "stdafx.h"

using namespace System;

enum ECOLOR { RED, BLUE, GREEN };

class Color
{
public:
    Color();
    ~Color();
    Color(ECOLOR);
};

Color::Color(ECOLOR color)
{
    switch (color)
    {
    case RED:
        Console::WriteLine(L"Hello Red\n");
        break;
    case BLUE:
        Console::WriteLine(L"Hello Blue\n");
        break;
    case GREEN:
        Console::WriteLine(L"Hello Green\n");
        break;
    default:
        break;
    }
}

int main(array<System::String ^> ^args)
{
    Color *blue = new Color(BLUE);

    return 0;
}

答案 3 :(得分:0)

替代1:简单的枚举类型

您可以在标题中定义一个没有类的简单枚举类型:

enum ColorType { red, blue, green };  // Simple enum

您可以重载常见的流操作,例如打印值,定制:

ostream& operator<< (ostream& os, ColorType color) {
    switch (color) {
    case red:
        std::cout << "red" << endl;  break;
    case blue:
        std::cout << "blue" << endl;  break;
    case green:
        std::cout << "green" << endl;  break;
    }
    return os;
}

在main()中,您可以轻松使用它:

    ColorType val = red; 
    if (val==blue) 
        cout << "blue";
    cout << val; 

在大多数情况下,我建议这样做。

备选方案2:完整的颜色类

但是,您不能使用不同的语义来丰富另一个的枚举,例如允许添加颜色(甚至在每个副本上清除颜色强度)或其他成员函数。

对于这种丰富的方法,你需要一堂课。在这里,您需要稍微改变一下您的定义。首先,成员不能与类本身具有相同的名称(其他类型定义和构造函数会非常模糊!):

class Color
{
public:
    enum MyColor { red, blue, green };  // That's just a nested type
    Color(MyColor c = red);             // That's a constructor for the class, with a default value
    void print();                       
private: 
    MyColor color;                      // That's a value
};

然后你可以开始使用这个类:

Color cr = Color::MyColor::red;  // access to nested color type needs some extra typing
Color choice; 
choice = cr; 
choice.print();         // of course you'd need to define print() first

然后由你来丰富这门课。