14

在以下代码中:

class Outer {
   private:
    void f_private(Outer::Inner in); // Wrong

   public:
    class Inner {};
    void f_public(Outer::Inner in); // OK
};

f_private()不能使用嵌套类Outer::Inner作为参数类型。但是在f_public().

有人可以向我解释这是基于什么规则,它有什么好处?

4

1 回答 1

31

问题不在于它是公开的还是私有的,而是秩序。这可能看起来很奇怪,对于其他类成员来说这不是问题,但考虑到在这种情况下您正在声明一个新的用户定义类型,因为您必须在使用它之前声明它:

class Outer 
{
public:
    class Inner {};   
    void f_public(Outer::Inner in);  // OK

private:
    void f_private(Outer::Inner in); // OK
};

或者:

class Outer
{
public:
    class Inner;                          // declare
    void f_public(Outer::Inner in);       // OK

private:
    void f_private(Outer::Inner in);       // OK
};

class Outer::Inner {};                     // define

void Outer::f_private(Outer::Inner in){}   // method definition after class definition

void Outer::f_public(Outer::Inner in){}    //

如果将类用作指针或引用参数,则无需在之前定义它,前向声明就足够了。

于 2021-04-17T09:04:42.220 回答