2011-11-01 123 views
2

嵌套类在C++

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

这功课吗?它似乎是功课,总是使用作业标签 – SpeedBirdNine

回答

6

我想你是来自java。

C++嵌套的struct/class就像一个java static嵌套类型。它与包含类型没有实例关系。

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

见示范http://ideone.com/ddjGX

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

你不知道。您只能初始化成员(类实例

  1. 我可以打电话从外类Foo()?

除非你是朋友或方法(FOO())是公共

  1. 能否请你告诉我什么是经验法则,而嵌套类和访问我应该知道成员?

我会选择一个嵌套类型只有

  1. 类型是一个实现细节或依赖于外部类
  2. 的共享静态成员的便利性(枚举类型定义,模板参数,静态方法和字段):内部类隐式地是外部类的朋友

我在下面说明了这些'经验法则'。请注意嵌套类型如何透明地访问专用外部类的成员。


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

您也可以使用范围操作符::实例内的对象(外::内())。如果你想从外部类接受foo(),你可能想要定义类似inner的外部类似的朋友类。