C ++中的嵌套类

时间:2011-11-01 23:12:36

标签: c++

我有

class outer: public base
{
public:
 class inner
 {
   foo();
 }
}
  1. 如何初始化这些嵌套类?
  2. 我可以从外部类调用foo()吗?
  3. 请告诉我在嵌套课程和访问会员时我应该知道的拇指规则是什么? 谢谢

2 个答案:

答案 0 :(得分:6)

我猜你是来自java。

c ++嵌套的struct / class类似于java static嵌套类型。它与包含类型没有实例关系。

实际上,您应该能够将内部类移动到包含的命名空间,而不需要将前内部类标记为外部类的朋友的其他更改。

参见演示http://ideone.com/ddjGX

  
      
  1. 如何初始化这些嵌套类?
  2.   

你没有。您只能初始化成员(类实例

  
      
  1. 我可以从外部类调用foo()吗?
  2.   

除非您是朋友或方法(foo())是公开的

  
      
  1. 请告诉我在嵌套课程和访问成员时我应该知道的拇指规则是什么?
  2.   

我只选择

的嵌套类型
  1. 类型是实现细节或取决于外部类
  2. 从外部类共享静态成员(枚举,typedef,模板参数,静态方法和字段)的便利性:内部类隐式地是外部类的朋友
  3. 我在下面说明了这些“经验法则”。请注意嵌套类型如何透明地访问外部类的私有成员。


    struct base {};
    
    class outer: public base
    {
      private:
        enum { some=42, special=67, implementation=999, details=-13 };
    
      public:
        struct inner 
        { 
          protected: 
            void foo() { int can_usethis = special + implementation + details; } 
        };
    
        outer() : _inner() { }
    
        void call_inner(inner& i) const 
        { 
            //i.foo(); // fails (protected)
        }
    
        void call_inner() const 
        { 
            //_inner.foo(); // fails (protected)
        }
    
      private:
        inner _inner;
    };
    
    
    int main()
    {
        outer o;
        outer::inner i;
    
        // i.foo(); // fails: protected
        o.call_inner(i);
    }
    

答案 1 :(得分:1)

您可以使用范围运算符::(outer :: inner())来实例化内部对象。如果你想从外部类加入foo(),你可能想要定义外部像内部的朋友类。