【发布时间】:2017-04-26 05:40:45
【问题描述】:
我不知道如何为嵌套类使用类型别名。下面是一个链表的类声明。我最初使用链接列表旁边的节点和迭代器类实现了链接列表类,现在我试图将它们嵌套在链接列表中。为了使该类更易于阅读,我宁愿在任何地方都使用迭代器而不是linkedlist::iterator,所以我想将它输入别名作为迭代器。以下是我的尝试之一,无论我进行什么更改,最终都会出现一个错误或另一个错误。这个行不通,因为这条线
class linkedlist::iterator;
导致错误 (g++ -std=c++11) 'class linkedlist' 中的 'iterator' does not name a type。
class linkedlist;
class linkedlist::iterator;
class linkedlist::node;
using iterator = linkedlist::iterator;
using node = linkedlist::node;
class linkedlist
{
public:
linkedlist();
iterator begin();
iterator end();
iterator insert(iterator pos, long data);
void print();
node* root;
node* final;
private:
class iterator
{
public:
const linkedlist* list;
node* ref;
iterator();
iterator(node& ref, const linkedlist& list);
long& operator*();
long* operator->();
iterator& operator++();
iterator& operator--();
bool operator==(iterator rhs);
bool operator!=(iterator rhs);
};
private:
class node
{
public:
long& operator*();
long data;
node* ptr_f;
node* ptr_b;
};
};
【问题讨论】:
-
而不是声明别名 outside 类(这意味着 unnamespaced
iterator可用于包括此标头的所有代码),是否更有意义预先声明iterator在类?另外,如果有公共成员函数获取和/或返回它的实例,我认为将iterator设为私有是没有意义的。这些签名不能在课堂外使用,对吗? -
我会试试的。至于public/private,接口我还没想好,你说的应该是对的。
-
您应该能够对大多数本地声明使用 auto 关键字...此外,您有一个具有嵌套名称的嵌套迭代器,或者如果您想要非限定名称,则将嵌套类移到父级别.或者,如果您不想污染全局命名空间但希望在某些源文件(或某些函数/类中)中使用较短的名称,则在需要时使用本地别名。
-
你不能在定义父类之前做别名,但你应该可以在定义类之后做。但是,您不想在标头中执行此操作,因为它会污染名称空间,如果您这样做,那么为什么要嵌套类开始呢?在 C++ 中,我认为嵌套没有任何优势。