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

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

来自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 ");

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

}

}

任何帮助将不胜感激!

谢谢!

missingfaktor asked 2020-01-06T22:44:53Z

4个解决方案

70 votes

模拟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();

Anton answered 2020-01-06T22:45:06Z

6 votes

随着C ++ 11引入constexpr,还有另一种实现类型枚举的方法。 一个实际上与普通枚举相同的变量(存储为int变量,可以在switch语句中使用),但还允许它们具有成员函数。

在头文件中,您应该输入:

class Planet {

int index;

public:

static constexpr int length() {return 8;}

Planet() : index(0) {}

constexpr explicit Planet(int index) : index(index) {}

constexpr operator int() const { return index; }

double mass() const;

double radius() const;

double surfaceGravity() const;

};

constexpr Planet PLANET_MERCURY(0);

constexpr Planet PLANET_VENUS(1);

constexpr Planet PLANET_EARTH(2);

// etc.

并在源文件中:

static double G = 6.67300E-11;

double Planet::mass() {

switch(index) {

case PLANET_MERCURY: return 3.303e+23;

case PLANET_VENUS: return 4.869e+24;

case PLANET_EARTH: return 5.976e+24;

// Etc.

}

}

double Planet::radius() {

// Similar to mass.

}

double Planet::surfaceGravity() {

return G * mass() / (radius() * radius());

}

然后可以用作:

double gravityOnMercury = PLANET_MERCURY.SurfaceGravity();

不幸的是,不能将枚举条目定义为类体内的静态常量。 它们必须在声明时进行初始化,因为它们是constexpr,但是在类内部,该类还不是完整类型,因此无法实例化。

bcmpinc answered 2020-01-06T22:45:44Z

1 votes

可能这就是您想要的-

#include

using namespace std;

class Planet {

double mass,radius;

Planet(double m, double r) : mass(m) : radius(r) {}

public:

static const Planet MERCURY;

void show(){

cout<

}

} ;

const Planet Planet::MERCURY = Planet(1.0,1.2);

int main(){

Planet p = Planet::MERCURY;

p.show();

}

这只是一个小代码,我确定您可以根据自己的需要进行修改。

UltraInstinct answered 2020-01-06T22:46:09Z

1 votes

这是丑陋的,冗长的并且通常是愚蠢的。 但是我认为我会通过解释的方式发布完整的代码示例。 对于额外的点,实际上可以通过稍稍调整模板的特殊性来定义在太阳行星上的编译时扩展迭代。

#include

#include

#include

#include

class Planet {

public:

static const double G = 6.67300E-11;

Planet(const ::std::string &name, double mass, double radius)

: name_(name), mass_(mass), radius_(radius)

{}

const ::std::string &name() const { return name_; }

double surfaceGravity() const {

return G * mass_ / (radius_ * radius_);

}

double surfaceWeight(double otherMass) const {

return otherMass * surfaceGravity();

}

private:

const ::std::string name_;

const double mass_;

const double radius_;

};

enum SolarPlanets {

MERCURY,

VENUS,

EARTH,

MARS,

JUPITER,

SATURN,

URANUS,

NEPTUNE

};

template

class SolarPlanet : public Planet {

};

template <>

class SolarPlanet : public Planet {

public:

SolarPlanet() : Planet("MERCURY", 3.303e+23, 2.4397e6) {}

};

template <>

class SolarPlanet : public Planet {

public:

SolarPlanet() : Planet("VENUS", 4.869e+24, 6.0518e6) {}

};

template <>

class SolarPlanet : public Planet {

public:

SolarPlanet() : Planet("EARTH", 5.976e+24, 6.37814e6) {}

};

template <>

class SolarPlanet : public Planet {

public:

SolarPlanet() : Planet("MARS", 6.421e+23, 3.3972e6) {}

};

template <>

class SolarPlanet : public Planet {

public:

SolarPlanet() : Planet("JUPITER", 1.9e+27, 7.1492e7 ) {}

};

template <>

class SolarPlanet : public Planet {

public:

SolarPlanet() : Planet("SATURN", 5.688e+26, 6.0268e7) {}

};

template <>

class SolarPlanet : public Planet {

public:

SolarPlanet() : Planet("URANUS", 8.686e+25, 2.5559e7) {}

};

template <>

class SolarPlanet : public Planet {

public:

SolarPlanet() : Planet("NEPTUNE", 1.024e+26, 2.4746e7) {}

};

void printTerranWeightOnPlanet(

::std::ostream &os, double terran_mass, const Planet &p

)

{

const double mass = terran_mass / SolarPlanet().surfaceGravity();

os << "Your weight on " << p.name() << " is " << p.surfaceWeight(mass) << '\n';

}

int main(int argc, const char *argv[])

{

if (argc != 2) {

::std::cerr << "Usage: " << argv[0] << " \n";

return 1;

}

const double earthweight = ::std::atof(argv[1]);

printTerranWeightOnPlanet(::std::cout, earthweight, SolarPlanet());

printTerranWeightOnPlanet(::std::cout, earthweight, SolarPlanet());

printTerranWeightOnPlanet(::std::cout, earthweight, SolarPlanet());

printTerranWeightOnPlanet(::std::cout, earthweight, SolarPlanet());

printTerranWeightOnPlanet(::std::cout, earthweight, SolarPlanet());

printTerranWeightOnPlanet(::std::cout, earthweight, SolarPlanet());

printTerranWeightOnPlanet(::std::cout, earthweight, SolarPlanet());

printTerranWeightOnPlanet(::std::cout, earthweight, SolarPlanet());

return 0;

}

Omnifarious answered 2020-01-06T22:46:29Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值