私有嵌套 类 的更短范围解析
Shorter scope resolutions for private nested classes
我有这种(简化的)情况:
class Tree {
class Iterator {
class Stack {
// ...
}
public:
// ...
}
public:
//...
}
我不想弄乱 classes 的定义,我决定只在 classes 内部编写方法声明。稍后(在下面)当我想定义,比如说,像这样的复制赋值运算符时:
Tree::Iterator::Stack& Tree::Iterator::Stack::operator = (const Stack& p_stack) {
// ...
}
我必须处理这些讨厌的范围决议。我想知道 是否有办法缩短它们,因为据我所知,using
和 typedef
没有给我任何东西。
编辑:由于这不是 CodeReview,@Yulian 要求澄清,这里是简短版本:
我正在制作一个迭代的红黑树实现。提到的class Iterator
是针对post-order遍历的(所以它是post-order-specific),class Stack
是它的效用class。在这个小程序中,只有class Tree
使用了Iterator
,只有Iterator
使用了Stack
.
经过@Yulian 的提醒,我回想起如果提到的 classes 单独定义(甚至可能作为模板),它会更面向对象,但这是一个小的,自包含的程序和我正在努力保持这种状态。
编辑:自包含 也意味着它是一个独立的单文件程序,因此没有任何 .h 文件或外部代码重用。为什么? 因为 ACADEMIA(以及相关的任意限制)。
首先,最好解释一下您想要实现的目标以及您认为这种方法对您的任务有好处的方式。
恕我直言,更好的方法是创建未嵌套的单个 classes,并在三个 class 中使用它们。这种方法称为 "HAS A"。它更干净,易于维护和从其他人那里理解。如果您提供更多详细信息,我们可以提出更好的 class 设计。
您可以使用 using
或 typedef
完全消除范围分辨率。但不是用传统的方式,因为你的嵌套 classes 被声明为私有的。因此,您必须在每个嵌套 class 到 "expose" 的 public
部分中使用额外的 using
。不幸的是,这打破了其中的 "privateness":
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) {
// ...
}
但是,您可以删除范围级别(外部级别除外,即 Tree::
),而不会通过以下方式公开私有嵌套 classes:
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) {
^^^^^^^^^^^ ^^^^^^^^^^^
}
你可以让预处理器帮你:
#define foobar Tree::Iterator::Stack
foobar& foobar::operator = (const Stack& p_stack) {
// ...
}
我有这种(简化的)情况:
class Tree {
class Iterator {
class Stack {
// ...
}
public:
// ...
}
public:
//...
}
我不想弄乱 classes 的定义,我决定只在 classes 内部编写方法声明。稍后(在下面)当我想定义,比如说,像这样的复制赋值运算符时:
Tree::Iterator::Stack& Tree::Iterator::Stack::operator = (const Stack& p_stack) {
// ...
}
我必须处理这些讨厌的范围决议。我想知道 是否有办法缩短它们,因为据我所知,using
和 typedef
没有给我任何东西。
编辑:由于这不是 CodeReview,@Yulian 要求澄清,这里是简短版本:
我正在制作一个迭代的红黑树实现。提到的class Iterator
是针对post-order遍历的(所以它是post-order-specific),class Stack
是它的效用class。在这个小程序中,只有class Tree
使用了Iterator
,只有Iterator
使用了Stack
.
经过@Yulian 的提醒,我回想起如果提到的 classes 单独定义(甚至可能作为模板),它会更面向对象,但这是一个小的,自包含的程序和我正在努力保持这种状态。
编辑:自包含 也意味着它是一个独立的单文件程序,因此没有任何 .h 文件或外部代码重用。为什么? 因为 ACADEMIA(以及相关的任意限制)。
首先,最好解释一下您想要实现的目标以及您认为这种方法对您的任务有好处的方式。 恕我直言,更好的方法是创建未嵌套的单个 classes,并在三个 class 中使用它们。这种方法称为 "HAS A"。它更干净,易于维护和从其他人那里理解。如果您提供更多详细信息,我们可以提出更好的 class 设计。
您可以使用 using
或 typedef
完全消除范围分辨率。但不是用传统的方式,因为你的嵌套 classes 被声明为私有的。因此,您必须在每个嵌套 class 到 "expose" 的 public
部分中使用额外的 using
。不幸的是,这打破了其中的 "privateness":
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) {
// ...
}
但是,您可以删除范围级别(外部级别除外,即 Tree::
),而不会通过以下方式公开私有嵌套 classes:
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) {
^^^^^^^^^^^ ^^^^^^^^^^^
}
你可以让预处理器帮你:
#define foobar Tree::Iterator::Stack
foobar& foobar::operator = (const Stack& p_stack) {
// ...
}