【问题标题】:Accessing a member of struct in class, LinkedList Node访问类中结构的成员,LinkedList 节点
【发布时间】:2014-08-09 10:48:51
【问题描述】:

所以我刚开始学习 C++ 的 LinkedLists。我知道 C+ 为他们提供了一个库,但我正试图专注于 LinkedLists。我看到的一个练习要求您设计一个带有 2 个成员函数和一个默认构造函数的链表类:add、isMember 和 LinkedList() 构造函数。添加函数将一个新节点添加到列表的前面。 isMember 测试列表中是否包含一个节点,该节点具有传入要添加的值。

我的问题是,我在结构中创建 ListNode *head,然后我尝试在 LinkedList 构造函数中访问它以将其设置为 null,它向我抛出“未声明的标识符”错误。即使我在结构中将它设置为 NULL 它也会给我同样的错误。如果我在构造函数中写“ListNode *head = NULL”,错误就会消失,但是我的 add 方法仍然会因为使用“未声明的标识符”头而变得疯狂。 到目前为止,这是我得到的:

LinkedList.h:

class LinkedList
{
protected:
    struct ListNode
    {
        double value;
        ListNode *next;
        ListNode(double value1, ListNode *next1 = NULL)
        {
            value = value1;
            next = next1;
        }
        ListNode *head;
    };
    // Public Interface
public:
    // Class Constructor(s)
    LinkedList();

    // Methods
    void add(double x);
    bool isMember(double x);

    // Private Class Members
private:
};

LinkedList.cpp:

#include "stdafx.h"
#include "LinkedList.h"  // Class Definition file

// Class Default Constructor
LinkedList::LinkedList()
{
    head = NULL;
}

// Class Destructor
LinkedList::~LinkedList(void)
{
    ListNode *nodePtr;
    while (nodePtr != NULL)
    {
        ListNode *garbage = nodePtr;
        nodePtr = nodePtr->next;
        delete garbage;
    }
}

void LinkedList::add(double x)
{
    ListNode *nodePtr, *prevNodePtr;
    if (head == NULL || head->value >= x)
    {
        head = new ListNode(x, head);
    }
    else
    {
        nodePtr = head->next;

        while (nodePtr != NULL && nodePtr->value < x)
        {
            prevNodePtr = nodePtr;
            nodePtr = nodePtr->next;
        }

        prevNodePtr->next = new ListNode(x, nodePtr);
    }
}
bool LinkedList::isMember(double x)
{
        //tbd
}

任何关于为什么会这样的线索都会有很大的帮助。谢谢!

【问题讨论】:

  • headListNode 的成员,而不是LinkedListListNode 拥有head 真的没有意义。

标签: c++ class struct linked-list nodes


【解决方案1】:

您声明了 ListNode 结构,但您从未在任何地方声明任何具有 ListNode 类型的对象。因此,当您尝试从 LinkedList 方法中访问 head 元素时,它确实是未声明的标识符,因为 LinkedList 类没有任何名为 head 的元素。

如果您像这样更改您的 LinkedList 声明:

class LinkedList
{
protected:
    struct ListNode
    {
        double value;
        ListNode *next;
        ListNode(double value1, ListNode *next1 = NULL)
        {
            value = value1;
            next = next1;
        }
        ListNode *head = NULL;
    } node; // actually instantiating ListNode element as part of LinkedList class
    // Public Interface
public:
    // Class Constructor(s)
    LinkedList();

    // Methods
    void add(double x);
    bool isMember(double x);

    // Private Class Members
private:
};

那么您可以这样调用head 元素:

LinkedList::LinkedList()
{
    node.head = NULL;
}

【讨论】:

    【解决方案2】:

    您可能希望 head 成为 LinkedList 的成员,而不是 ListNode。

    class LinkedList {
        class ListNode {
            double value;
            ListNode *next;
        };
        ListNode *head;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-31
      • 2023-03-22
      • 2022-01-04
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多