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

时间:2015-11-12 20:45:09

标签: c++ scope nested-class

我有这种(简化)情况:

class Tree {
    class Iterator {
        class Stack {
            // ...
        }
    public:
        // ...
    }
public:
    //...
}

我不想让课程变得杂乱无章。定义,我决定只在类本身内编写方法声明。稍后(下面是waaay)当我想要定义复制赋值运算符时,如下所示:

Tree::Iterator::Stack& Tree::Iterator::Stack::operator = (const Stack& p_stack) {
// ...
}

我必须处理这些令人讨厌的范围决议。我想知道是否有缩短它们的方法,因为usingtypedef,据我所知,不提供给我任何东西

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

我正在进行迭代的Red-Black Tree实现。提到class Iterator用于订单后遍历(所以它是特定于订单后的),class Stack是其实用程序类。在这个简短的程序中,只有class Tree使用Iterator,而只有Iterator使用Stack

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

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

3 个答案:

答案 0 :(得分:3)

您可以使用usingtypedef完全消除范围分辨率。但不是传统方式,因为您的嵌套类被声明为私有。因此,您必须在每个嵌套类的using部分中使用其他public来"公开"他们。不幸的是,打破了他们的私密性

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) {
// ...
}

LIVE DEMO

但是,您可以通过以下方式删除范围级别(外部范围除外,即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) {
^^^^^^^^^^^ ^^^^^^^^^^^
}

LIVE DEMO

答案 1 :(得分:0)

首先,解释您希望实现的目标以及您认为此方法对您的任务有益的方式是很好的。 恕我直言,更好的方法是创建不嵌套的单个类,并在Three类中使用它们。这种方法称为“HAS A”。它更易于维护和理解。如果您提供更多详细信息,我们可以提供更好的课堂设计。

答案 2 :(得分:-2)

您可以让预处理器帮助您:

#define foobar Tree::Iterator::Stack    
foobar& foobar::operator = (const Stack& p_stack) {
    // ...
}