【问题标题】:Enumerated data types and class APIs in C++C++ 中的枚举数据类型和类 API
【发布时间】:2009-05-17 16:45:38
【问题描述】:

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

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

【问题讨论】:

    标签: c++ api coding-style class


    【解决方案1】:

    是的,你可以这样做:

    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,以便您拥有 Pizza::Type 和 Pizza::Size。)

    【讨论】:

    • 你的枚举实际上是私有的,所以其他人不能声明这些类型的变量。将他们的声明移到公共部分。
    【解决方案2】:

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

    【讨论】:

    • +1 用于 struct { enum } 提示。顺便说一句,你错过了 };对于结构栏
    【解决方案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();
    

    【讨论】:

      【解决方案4】:

      只要枚举类型是公开的,就可以在类外使用。您只需将其范围限定为:Pizza::PizzaType。静态方法以及静态常量和变量存在相同的规则。

      【讨论】:

        【解决方案5】:

        您可以在类内部定义枚举并在外部使用它,就像使用命名空间一样,即 classname::enum_type。实际上,在类中定义它是一个好主意,因为它可以避免全局命名空间污染。

        【讨论】:

          【解决方案6】:

          没问题,你可以通过指定Pizza::PizzaType来创建这个枚举类型的变量。

          将枚举放在您的班级中,如果您希望它们被外部访问,请确保它们也是公开的。

          Pizza p;
          p.setPizzaType(Pizza::PAN);
          Pizza::PizzaType pt = p.getPizzaType();
          assert(pt == Pizza::PAN);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-06-25
            • 1970-01-01
            • 1970-01-01
            • 2013-03-13
            • 2018-03-06
            • 1970-01-01
            相关资源
            最近更新 更多