如果您应该将所有内容封装在类定义中,那么如何在类中使用枚举数据类型呢?例如,我刚刚编写了以下代码......
enum PizzaType {DEEP_DISH, HAND_TOSSED, PAN};
enum PizzaSize {SMALL, MEDIUM, LARGE};
class Pizza {
public:
Pizza();
void setPizzaType(PizzaType type);
PizzaType getPizzaType();
void setPizzaSize(PizzaSize size);
PizzaSize getPizzaSize();
void setToppings(int toppings);
int getToppings();
void outputDescription();
double computePrice();
private:
PizzaType pizzaType;
PizzaSize pizzaSize;
int totalToppings;
};
有没有办法在类本身中包含枚举数据类型,但仍允许从外部访问mutator / accessor函数?
答案 0 :(得分:5)
是的,你可以这样做:
class Pizza {
public:
enum PizzaType {DEEP_DISH, HAND_TOSSED, PAN};
enum PizzaSize {SMALL, MEDIUM, LARGE};
Pizza();
void setPizzaType(PizzaType type);
PizzaType getPizzaType();
void setPizzaSize(PizzaSize size);
PizzaSize getPizzaSize();
void setToppings(int toppings);
int getToppings();
void outputDescription();
double computePrice();
private:
PizzaType pizzaType;
PizzaSize pizzaSize;
int totalToppings;
};
..然后其他人说,你只需要使用Pizza“命名空间”来获取枚举类型:
Pizza::PizzaType tmp = pPizza->getPizzaType();
等等。
(作为一种风格的说明,当你把这些枚举放在这个类的内部时,我会亲自删除它前面的披萨,这样你就有了Pizza :: Type和Pizza :: Size。)
答案 1 :(得分:3)
class Pizza {
public:
enum PizzaType {DEEP_DISH, HAND_TOSSED, PAN};
void setPizzaType(PizzaType type);
PizzaType getPizzaType();
};
...
Pizza p;
p.setPizzaType( Pizza::DEEP_DISH );
Pizza::PizzaType pt = p.getPizzaType();
答案 2 :(得分:3)
在C ++中使用枚举的首选方法是在类中定义它们:
class Foo {
public:
enum Bar {
ENUM_VALUE1,
ENUM_VALUE2
};
};
然后,您可以使用以下方式引用它们:
Foo::Bar var;
var = Foo::ENUM_VALUE1;
在课程中,您可以删除Foo::
前缀。
您可能已经注意到,虽然枚举的类型是Foo::Bar
,但值不是通过Foo::Bar::ENUM_VALUE1
引用的,而是出现在Foo
的命名空间中。如果不同的枚举共享相同的值名称,这可能会有问题。为避免这种情况,您可以执行以下操作:
class Foo {
public:
struct Bar {
enum ENUM {
ENUM_VALUE1,
ENUM_VALUE2
};
struct Baz {
enum ENUM {
ENUM_VALUE1,
ENUM_VALUE2
};
};
};
Foo::Bar::ENUM e = Foo::Bar::ENUM_VALUE1;
Foo::Baz::ENUM e2 = Foo::Baz::ENUM_VALUE1;
答案 3 :(得分:1)
这不是问题,您可以通过指定Pizza :: PizzaType来创建此枚举类型的变量。
将枚举放入您的课程中,如果您希望外部访问它们,请确保它们也是公开的。
Pizza p;
p.setPizzaType(Pizza::PAN);
Pizza::PizzaType pt = p.getPizzaType();
assert(pt == Pizza::PAN);
答案 4 :(得分:1)
只要枚举类型是公共的,就可以在类外使用它。你只需要它的范围我:Pizza :: PizzaType。静态方法以及静态常量和变量也存在相同的规则。
答案 5 :(得分:1)
您可以在类中定义枚举,并在外部使用它,就像使用命名空间一样,即classname :: enum_type。实际上,在类中定义它是一个好主意,因为它避免了全局名称空间污染。