当前位置: 首页 > 面试题库 >

如何在C ++中编写具有多个数据字段的类Java枚举类?

戚永福
2023-03-14
问题内容

来自Java背景,我发现C 的枚举非常la脚。我想知道如何用C 编写类似Java的枚举(枚举值是对象,并且可以具有属性和方法的枚举)。

例如,将以下Java代码(其中一部分足以说明该技术)转换为C ++:

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    private double mass()   { return mass; }
    private double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage:  java Planet <earth_weight>");
            System.exit(-1);
        }
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }
}

任何帮助将不胜感激!

谢谢!


问题答案:

模拟Java枚举的一种方法是使用私有构造函数创建一个类,该类将自身的副本实例化为静态变量:

class Planet {  
  public: 
    // Enum value DECLARATIONS - they are defined later 
    static const Planet MERCURY;  
    static const Planet VENUS;  
    // ...

  private: 
    double mass;   // in kilograms  
    double radius; // in meters

  private: 
    Planet(double mass, double radius) {  
        this->mass = mass;  
        this->radius = radius;  
    }

  public: 
    // Properties and methods go here 
};

// Enum value DEFINITIONS 
// The initialization occurs in the scope of the class,  
// so the private Planet constructor can be used. 
const Planet Planet::MERCURY = Planet(3.303e+23, 2.4397e6);  
const Planet Planet::VENUS = Planet(4.869e+24, 6.0518e6);  
// ...

然后,您可以使用如下枚举:

double gravityOnMercury = Planet::MERCURY.SurfaceGravity();


 类似资料:
  • 问题内容: 基本上,我所做的是为州写一个枚举,我不仅希望能够像州一样访问它们,而且还希望访问它们的缩写以及它们是否是原始殖民地。 这似乎按我预期的那样工作。我可以 对于涉及枚举的特定情况,这是执行此操作的最佳方法,还是设置和格式化此枚举的更好方法?预先感谢所有人! 问题答案: 首先,枚举方法不应大写。它们是与其他方法一样的方法,具有相同的命名约定。 其次,您所做的并不是建立枚举的最佳方法。不要为每

  • 枚举类(“新的枚举”/“强类型的枚举”)主要用来解决传统的C++枚举的三个问题: 传统C++枚举会被隐式转换为int,这在那些不应被转换为int的情况下可能导致错误 传统C++枚举的每一枚举值在其作用域范围内都是可见的,容易导致名称冲突(同名冲突) 不可以指定枚举的底层数据类型,这可能会导致代码不容易理解、兼容性问题以及不可以进行前向声明 枚举类(enum)(“强类型枚举”)是强类型的,并且具有类

  • 例如,我如何做类似的事情: 结果示例:

  • 问题内容: 任务是使用java实现漂亮的策略设计模式: 但是当我指的是 无法对非静态字段someField进行静态引用。 有什么问题,有可能做得更好吗? 问题答案: 专门的不过是具有内部类语义的子类。如果在编译后查看字节码,您会注意到编译器仅插入用于读取私有字段的访问器方法,但是任何专用枚举都被编译为自己的类。您可以考虑将其实现为: 如您所见,发生相同的编译器错误。实际上,您的问题与s 不相关,而