私有嵌套类的范围分辨率更短

Ste*_*vić 6 c++ scope nested-class

我有这个(简化)情况:

class Tree {
    class Iterator {
        class Stack {
            // ...
        }
    public:
        // ...
    }
public:
    //...
}
Run Code Online (Sandbox Code Playgroud)

我不想弄乱类的定义,我决定只在类本身内编写方法声明.稍后(下面是waaay)我想要定义,比如复制赋值运算符,如下所示:

Tree::Iterator::Stack& Tree::Iterator::Stack::operator = (const Stack& p_stack) {
// ...
}
Run Code Online (Sandbox Code Playgroud)

我必须处理这些令人讨厌的范围决议.我想知道,如果有一种方法,以缩短他们,因为usingtypedef,因为我知道他们,不提供我任何东西.

编辑:由于这不是CodeReview,@ Yulian要求澄清,这里是简短的版本:

我正在进行迭代的Red-Black Tree实现.提到的class Iterator是后期遍历(因此它是特定于订单后的顺序),并且class Stack是它的实用程序类.在这个简短的程序中,只class Tree使用Iterator,而且只Iterator使用Stack.

在@Yulian的提醒之后,我回想一下,如果提到的类被单独定义(甚至可能作为模板),它会更加面向对象,但这是一个小的,自包含的程序,我试图保持这种方式.

编辑:自包含也意味着它是一个独立的单文件程序,所以没有.h文件或外部代码重新使用.为什么?因为ACADEMIA(和相关的任意限制).

101*_*010 3

您可以使用using或完全消除示波器分辨率typedef。但不是用传统的方式,因为你的嵌套类被声明为私有的。因此,您必须usingpublic每个嵌套类的部分中使用 extra 来“暴露”它们。不幸的是,这破坏了它们的“私密性” :

class Tree {
    class Iterator {
        class Stack {
            Stack& operator = (const Stack& p_stack);
        };
    public:
      using Stack_Out = Stack;

        // ...
    };
public:
    using Iterator_Out = Iterator::Stack_Out;
    //...

};

using Stack = Tree::Iterator_Out;

Stack& Stack::operator = (const Stack& p_stack) {
// ...
}
Run Code Online (Sandbox Code Playgroud)

现场演示

但是,您可以删除范围级别(外部级别除外,即Tree::),而无需通过以下方式公开私有嵌套类:

class Tree {
    class Iterator {
        friend class Tree;
        ^^^^^^^^^^^^^^^^^^
        class Stack {
            Stack operator = (const Stack& p_stack);
        };
    public:

        // ...
    };

    using Stack = Iterator::Stack;
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

public:

}; 

Tree::Stack Tree::Stack::operator = (const Stack& p_stack) {
^^^^^^^^^^^ ^^^^^^^^^^^
}
Run Code Online (Sandbox Code Playgroud)

现场演示