【问题标题】:C++: Equivalent to "using namespace <namespace>" but for classes?C ++:相当于“使用命名空间<namespace>”但对于类?
【发布时间】:2010-12-15 16:55:24
【问题描述】:

假设你有一个类,其中定义了一个枚举:

class MyClass {
  typedef enum _MyEnum{ a } MyEnum;
}

有没有办法从另一个类访问值 a 而不必将其称为 MyClass::a?如果枚举包含在命名空间而不是类中,则“使用命名空间;”解决了这个问题 - 有没有等效的方法来处理类?

【问题讨论】:

  • 下划线后跟一个大写字母是为编译器保留的名称。
  • 正如您声明的那样,“MyEnum”将是私有的,因此您根本无法访问它

标签: c++ enums namespaces


【解决方案1】:

我很确定你被“MyClass::a”困住了。另外......这样做不会破坏将枚举放在一个类中的目的吗?

【讨论】:

  • 取决于使用的地方。它可以在本地使用,例如在函数中:void func(){using MyClass::a;}。这不会通过在函数外部引用“a”来访问它。所以不,我不认为它会破坏目的。
【解决方案2】:

您能做的最好的就是将单个符号拉入类中。

class SomeClass {
    typedef MyClass::MyEnum MyEnum;
    MyEnum value;
};

请注意,如果 typedef 在类的公共部分中,那么任何人都可以将 SomeClass::MyEnum 称为 MyClass::MyEnum 的同义词。

【讨论】:

    【解决方案3】:

    另一种方法是从 Enum-holder-类公开派生:

    struct Holder {
        enum MyEnum { a };
    };
    
    class User : public Holder {
    public:
        // a now visible in class
        MyEnum f() { return a; } 
    };
    
    // a visible outside too
    User::MyEnum f() { return User::a; }
    

    【讨论】:

      【解决方案4】:

      除非另一个类是 MyClass 的派生类(并且您的枚举是受保护的/公共的),否则不会。我知道这不是一个答案,但我认为枚举在 MyClass 中定义是有原因的,所以不要尝试使其全局可用。

      【讨论】:

        【解决方案5】:

        您可以按如下方式单独拉入每个常量:

        class MyClass {
          public:
          // I added a value here intentionally to show you what to do with more than one enum value
          typedef enum _MyEnum{ a, b } MyEnum;
        }
        using MyClass::a;
        using MyClass::b;
        //... likewise for other values of the enum
        

        【讨论】:

          猜你喜欢
          • 2012-06-16
          • 1970-01-01
          • 2013-02-09
          • 1970-01-01
          • 1970-01-01
          • 2014-05-21
          • 1970-01-01
          • 2011-08-01
          • 1970-01-01
          相关资源
          最近更新 更多