【问题标题】:How do you type alias nested classes? [duplicate]你如何键入别名嵌套类? [复制]
【发布时间】: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++ 中,我认为嵌套没有任何优势。

标签: c++ c++11


【解决方案1】:
class linkedlist;

这称为“前向声明”。

只有顶级类可以前向声明。嵌套类不能在类外前向声明。

现在,一旦您在定义类的过程中,您可以在类的范围内前向声明嵌套类

class linkedlist {

    class iterator;

    // Stuff that uses the forwardly-declared iterator class

    class iterator {

        // And the definition of the iterator class
    };
};

这就是前向声明的工作原理。

在您的示例中,只需在 linkedlist 类的定义之后移动两个“使用”别名(在公开嵌套类之后),仅此而已。

我同意,嵌套前向声明在其范围之外是可能的,但事实并非如此。这就是生活。

【讨论】:

  • 这清除了一些事情,但我想我想做的事情并不能真正做到。在编写实现时,我仍然需要编写linkedlist::iterator,但是为此包含一个类型别名会将别名添加到整个命名空间中,因此在主迭代器中将是一个有效类型。
  • C++ 并不完美。至少现在还没有。
猜你喜欢
  • 2020-10-30
  • 2018-10-15
  • 1970-01-01
  • 2021-08-16
  • 2010-11-28
  • 1970-01-01
  • 2016-04-28
  • 2013-10-14
  • 2020-10-20
相关资源
最近更新 更多