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)
我必须处理这些令人讨厌的范围决议.我想知道,如果有一种方法,以缩短他们,因为using和typedef,因为我知道他们,不提供我任何东西.
编辑:由于这不是CodeReview,@ Yulian要求澄清,这里是简短的版本:
我正在进行迭代的Red-Black Tree实现.提到的class Iterator是后期遍历(因此它是特定于订单后的顺序),并且class Stack是它的实用程序类.在这个简短的程序中,只class Tree使用Iterator,而且只Iterator使用Stack.
在@Yulian的提醒之后,我回想一下,如果提到的类被单独定义(甚至可能作为模板),它会更加面向对象,但这是一个小的,自包含的程序,我试图保持这种方式.
编辑:自包含也意味着它是一个独立的单文件程序,所以没有.h文件或外部代码重新使用.为什么?因为ACADEMIA(和相关的任意限制).
您可以使用using或完全消除示波器分辨率typedef。但不是用传统的方式,因为你的嵌套类被声明为私有的。因此,您必须using在public每个嵌套类的部分中使用 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)
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |