C ++中枚举的数据类型和类API

时间:2009-05-17 16:45:38

标签: c++ api coding-style class

如果您应该将所有内容封装在类定义中,那么如何在类中使用枚举数据类型呢?例如,我刚刚编写了以下代码......

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函数?

6 个答案:

答案 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。实际上,在类中定义它是一个好主意,因为它避免了全局名称空间污染。