如何在C ++中使用枚举类型?

时间:2010-04-08 19:38:39

标签: c++ enums

我不明白如何使用枚举类型。我明白它们是什么,但我没有达到目的。

我制作了一个输入三角形三边的程序,输出它们是等腰,斜角或等边。我想在某个地方加入枚举类型,但是不知道在哪里以及如何使用它们。任何帮助将不胜感激。

#include <iostream>

using namespace std;

enum triangleType {scalene, isosceles, equilateral, noTriangle};

triangleType triangleShape(double x, double y, double z);
void printTriangleShape(triangleType shape);

int main()
{
    double x, y, z;
    triangleType scalene, isosceles, equilateral, noTriangle;

    cout << "Please enter the three sides of a triangle:" << endl;
    cout << "Enter side 1: ";
    cin >> x;
    cout << endl;
    cout << "Enter side 2: ";
    cin >> y;
    cout << endl;
    cout << "Enter side 3: ";
    cin >> z;
    cout << endl;

    triangleType t = triangleShape(x, y, z); 
printTriangleShape(t);

    return 0;
}

triangleType triangleShape(double x, double y, double z)
{
   triangleType scalene, isoceles, equilateral, noTriangle;
    if (((x+y) > z) && ((x+z) > y) && ((y+z) > x))
    {
        cout << "You have a triangle!" << endl;
            if (x == y && y == z)
               return equilateral;
            else if (x == y || x == z || y == z)
                 return isosceles;
            else
               return scalene;
    }
    else if ((x+y) <= z || ((x+z) <= y) || ((y+z) <= x))
        return noTriangle;  
} 
void printTriangleShape(triangleType shape)
{
    switch (shape)
    {
    case scalene: cout << "Your triangle is Scalene!" << endl;
        break;
    case isosceles: cout << "Your triangle is an isosceles!" << endl;
        break;
    case equilateral: cout << "Your triangle is an equilateral!" << endl;
        break;

    }
}

5 个答案:

答案 0 :(得分:7)

这是一个值,您可能希望从函数中返回它。

尝试:

triangleType triangleShape(double x, double y, double z) {
  if (...) {
    return scalene;
  } else if (...) {
    return isosceles.
  } else if (...) {
    return equilateral
  } else {
    return noTriangle;
  } 
}

注意,您可以打印结果,但会打印为整数:   scalene = 0, isosceles = 1, ...

编辑,打印时您可能希望这样做:

void printTriangleShape(triangleType shape) {
   switch (shape) {
     case scalene:
       cout << "Your triangle is Scalene!" << endl;
       break;
     case isosceles:
       cout << "Your triangle is isosceles!" << endl;
       break;
     ...;
   }
}

答案 1 :(得分:1)

在C枚举中,调试更容易,因为调试器通常会打印名称值而不是数值。它们还允许编译器强制执行可以确定将无效值存储到枚举变量中的位置。

在C ++中还有另一个好处,就是你可以在重载中使用枚举类型。 例如,您可以:

ostream & operator<<(ostream & ostr, triangleType t) {
     string s;
     switch (t) {
          case scalene:
             s = "scalene";
             break;
          case isosceles:
             s = "isosclese";
             break;
          case equilateral:
             s = "equilateral";
             break;
          case noTriangle:
             s = "noTriangle";
             break;
          default:
             s = "error bad triangle type";
             break;
       }
       return cout << s;
}

然后在main do

cout << "Your triangle is" << t << endl;

答案 2 :(得分:0)

枚举可用于识别对象的“类型”,就像您的情况一样。

例如,您的三角形形状方法可以返回triangleType,这样您就可以在main方法中执行所有cout << "...",并将显示逻辑与三角形对象分开。

答案 3 :(得分:0)

我们的想法是使用不具有意义的标签(红色,绿色,蓝色......)来替换不能解释其含义的数字(1,2,3 ...)。代码中使用的只有你理解其含义的数字才被称为“幻数”,应该避免使用,因为它会阻止其他人理解你的代码。

答案 4 :(得分:0)

枚举是c ++中的新类型。使用此类型可以创建额外的类型安全性,因为您只能使用为该枚举定义的值。枚举值将自动编号,除非您自己指定一个值,这应该很少需要。一个例子:

enum Color { Red, Green, Blue }; // Red = 0, Green = 1, Blue = 2
enum Shape { Circle, Square };   // Circle = 0, Square = 1

int printColor(Color c)
{
    // do something with the color here, for example print it.
    switch(c)
    {
        case Red:
            cout << "Red";
            break;
        case Green:
            cout << "Green";
            break;
        case Blue:
            cout << "Blue";
            break;
    }
}

int main(int argc, char* argv[])
{
    printColor(Red); // works
    printColor(0);   // will give an error or warning in C++.
                     // However, C does less type checking and allows this.

    printColor(Circle);
                     // error, the type is wrong even if the values are identical.
}

您在printColor(0)调用中添加了类型安全性 - c ++会在此处执行其他类型检查,因此您不能错误地在调用中添加无效数字。您当然可以使用#define来获得相同的结果,甚至直接放置它们,但在这种情况下,如果您输入无效值,编译器将无法发出警告。