关于c ++:头文件,类和主文件中的枚举

Enums in headers, classes, and main

我对在哪里定义枚举以及在哪里使用枚举感到困惑。我有3个文件,一个main.cpp、function.cpp和function.h(名称已经简化)。在功能上,我有

1
2
3
4
5
6
7
class Function{
  public:
    enum Letters{A, B, C};
//more stuff not related
  private:
//stuff
}

和function.h包含在main.cpp和function.cpp中

但是在main.cpp中,我希望有一个变量:letters letter;这样我就可以从用户那里获得输入,将输入设置为类型i.e letter=a,然后将其用于构造函数构造(…,letter,…),因为function.cpp中的构造函数需要参数中的"letters"。

那么有没有办法访问main.cpp中的"letters"类型?如果不是,我考虑重写构造函数,以便它接受"string letterin"参数,然后将字符串更改为类型,即if(letterin=="a")type=a;

(我在这里概括了很多变量名,这样它就可以应用于其他人的情况,如果有帮助的话,我可以更详细地介绍我自己的项目)


由于您希望在构造函数中使用枚举,我假设您可以将其公开。因此,您可以像这样访问它:

1
2
3
4
5
6
7
8
9
10
11
12
class Function{
    enum Letters{A, B, C};
//more stuff not related
}

int main(int argc, char** argv} {

    Function::Letters letter1 = Function::A;
    //or
    Function::Letters letter2 = Function::Letters::A;

}

或者,正如Medinoc指出的那样,如果您声明您的枚举为EDOCX1[0]

1
2
3
4
int main(int argc, char** argv} {

    Function::Letters letter = Function::Letters::A;
}


你可以用很多方法做到。

您可以在声明类的头中声明它:

1
2
3
4
5
6
7
 class HasEnums
 {
    public:
       enum Letters { A, B, C };
    ...
    HasEnums(Letters letter) { ... }
 };

然后在main.cpp中:

1
2
3
4
5
6
#include"hasenums.h"

HasENums::Letters letter = A;

HasEnums h(letter);
HasEnums i(HasENums::B);

或者在头文件中,在类之外:

1
2
3
4
5
6
7
enum Letters { A, B, C };

class NoEnums
{
   public:
     NoEmums(Letters letter) { ... }
};

然后主要是:

1
2
3
4
5
6
#include"noenums.h"

Letters letter = A;

NoEnums n(letter);
NoEnums m(B);

还有许多其他可能的场景,但这两个场景似乎最合理,这取决于您实际想要描述的内容。在类中声明Letters的好处是,您可以在另一个类中拥有另一个enum Letters,并且在同一编译单元中需要noeums.h和新文件noeums2.h时,不需要重命名一个即可同时使用这两个类。

还要注意,您可以制作一个私有的enum,它不能在类外使用:

1
2
3
4
5
6
7
class HasPrivEnum
{
   enum Letters { A, B, C };
   ...
  public:
   HasPrivEnum(Letters letter) {...}
};

但是现在您将无法编译在类外使用HasPrivEnum::Letters的代码(没有friend声明)。这在某些情况下是有用的,但从你描述的情况看却不是。