【问题标题】:invalid use of non-static data member 'linkedList<int>::dummyNode' c++无效使用非静态数据成员 'linkedList<int>::dummyNode' c++
【发布时间】:2017-09-12 06:07:49
【问题描述】:

dummyNode 声明变量运行良好,直到我将迭代器类编写为嵌套,现在它给我一个错误,无效使用非静态数据成员,'linkedList::dummyNode'c++,如果我删除迭代器类它运行良好 模板

class linkedList
{

private:
    listNode<T> * head, *tail;
    listNode<T> *  dummyNode = new listNode<T>;
    int sz = 0;
public:
    class iterator
    {
    public:
        iterator()
        {
            itrNode = head;
        }
        void operator ++ ()
        {
            try{
                if(itrNode == dummyNode)
                    throw "Sorry this is the end of the list\n";
                else
                {
                    itrNode = itrNode->next;
                }

            }catch(const char * error)
            {
                cerr << error;
            }
        }
        T& operator *()
        {
            return *(itrNode->value);
        }
        void operator -- ();
    private:
        listNode<T> * itrNode;

    };
    linkedList();
    ~linkedList();
    linkedList(T value, int initial_size);
    iterator begin();


};

【问题讨论】:

  • 你在内部类中的构造函数引用了head,它是外部类的一个数据成员。您应该改为创建一个函数linkedlist::begin,它返回正确的迭代器。如果您需要迭代器的直接构造函数,它需要一个 linkedlist 作为参数。
  • 对不起,我不明白问题出在哪里?!我也不明白解决方案,请你写代码好吗?!

标签: c++ linked-list iterator inner-classes


【解决方案1】:

C++ 嵌套类不与其外部类共享数据——如果存在这种情况,内部类的每个实例都将与外部类的对应实例处于一对一关系,因此不添加额外的功能。相反,嵌套类的主要目的是:

  1. 命名空间含义:linkedlist::iteratorlinkedlist_iterator更有意义
  2. 根据 C++ 版本标准,嵌套类对外部类实例的成员对象具有额外的可见性
  3. 也许还有我不知道的其他人

你代码中最大的问题是迭代器的构造函数

    iterator()
    {
        itrNode = head;
    }

数据head 在内部类的上下文中没有任何意义,因为它是linkedlist 对象的数据成员——同样,iterator属于实例linkedlist 类的。相反,构造函数应该类似于

    iterator(linkedlist<T>& list)
    {
        itrNode = list.head; // Might not work in C++03
    }

您可能需要对模板化进行其他更改(我不确定;我之前没有制作过嵌套的模板类)。此外,这种类型的链表构造函数应该可以工作,但不遵循标准范例。更标准的是添加功能

iterator linkedlist::begin();
iterator linkedlist::end();

linkedlist 类。更好的是创建begin(linkedlist&amp;)end(linkedlist&amp;) 函数。 this following SO post 对此进行了解释。

【讨论】:

  • if(itrNode == dummyNode) 我想我应该做同样的事情,但我不知道怎么做?!
  • 你是对的,你也必须解决这个问题。你知道怎么做;您已经在iterator 类中有一个私有的itrNode 条目,您只需对dummyNode 执行相同的操作。我承认我不确定你的虚拟节点是做什么的,但我猜这些细节在 linkedlist 的构造函数和成员函数的实现中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 2023-03-12
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
相关资源
最近更新 更多