C++ 未定义对'的引用;库存:插入端(节点*,int)和#x27;

C++ 未定义对'的引用;库存:插入端(节点*,int)和#x27;,c++,class,struct,append,singly-linked-list,C++,Class,Struct,Append,Singly Linked List,尝试构建/编译程序时出现“未定义引用”错误: obj\Debug\main.o | |在函数main'中:| C:\Users\user1\Desktop\Project5Example\main.cpp | 13 |对Inventory::insertEnd(Node*,int)”的未定义引用| ... ||错误:ld返回了1个退出状态| ||==生成失败:4个错误,0个警告(0分钟,1秒))===| 我对C++很陌生。我做错了什么?我怎样才能修好它? 我觉得跟我的头有关系吗?但我真的搞不懂是

尝试构建/编译程序时出现“未定义引用”错误:

obj\Debug\main.o | |在函数
main'中:|
C:\Users\user1\Desktop\Project5Example\main.cpp | 13 |对
Inventory::insertEnd(Node*,int)”的未定义引用| ... ||错误:ld返回了1个退出状态| ||==生成失败:4个错误,0个警告(0分钟,1秒))===|

我对C++很陌生。我做错了什么?我怎样才能修好它? 我觉得跟我的头有关系吗?但我真的搞不懂是怎么回事

错误发生在main.cpp行
head=inventory1.insertEnd(head,8)

这是我的密码:

清单h

\ifndef库存
#定义库存
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
结构体类型
{
int数据;
节点*下一步;
};
班级清单
{
公众:
//默认构造函数
存货();
//修改成员函数
节点*newNode(int数据);
节点*insertEnd(节点*head,int数据);
私人:
//数据成员
节点*头;
节点*拖车;
};
#endif//INVENTORY\u H
Inventory.cpp

#包括“Inventory.h”
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
存货::存货()
{
//将标题和尾部设置为NULL
head=NULL;
拖车=空;
}
//使用给定数据分配新节点
Node*newNode(int数据)
{
Node*new_Node=新节点;
新建_节点->数据=数据;
新建节点->下一步=空;
返回新的_节点;
}
//函数以在
//使用递归结束链表。
节点*insertEnd(节点*head,int数据)
{
//如果链接列表为空,请创建一个
//新节点(假设newNode()分配
//具有给定数据的新节点)
if(head==NULL)
返回newNode(数据);
//如果我们还没有到达终点,继续穿越
//递归地。
其他的
头部->下一步=插入(头部->下一步,数据);
回流头;
}
main.cpp

#包括
#包括“Inventory.h”
使用名称空间std;
int main()
{
//创建一个库存清单
存货清单1;
Node*head=NULL;
head=目录1.插入(head,8);
head=目录1.插入(head,11);
head=目录1.插入(head,20);
返回0;
}

首先,结构
节点
应该是类
库存
的私有成员。相应地,类
库存
不应包含具有返回类型
节点*
的公共成员函数。例如,这个成员函数

Node *newNode(int data);
Node* insertEnd(Node* head, int data);
应该删除。反过来,公共成员的职能

Node *newNode(int data);
Node* insertEnd(Node* head, int data);
应该像

void insertEnd( int data );
static Node* insertEnd(Node* head, int data);
如果它是必需的(但不是必需的),该函数可以调用声明如下的私有静态成员函数

void insertEnd( int data );
static Node* insertEnd(Node* head, int data);
由于声明了一个双面单链表,因此将函数
insertEnd
定义为递归函数没有意义,因为没有递归。一个新的节点ia附加到您命名的节点上,类似于
traile
,不过最好将其命名为
tail

此外,在函数
newNode
insertEnd
的定义中,您忘记指定类Inventory的名称,如

Node * Inventory::newNode(int data)
{
    //...
}

Node * Inventory::insertEnd(Node* head, int data)
{
    //...
}
这一部分主要是

Inventory inventory1;

Node* head = NULL;

head = inventory1.insertEnd(head, 8);
head = inventory1.insertEnd(head, 11);
head = inventory1.insertEnd(head, 20);
没有道理。对象
inventory1
已经包含了应该为该对象更新的数据成员
head
(和
trail

例如,可以按照下面的演示程序中所示的方式定义该类

#include <iostream>

class Inventory
{
public:
    Inventory() = default;

    Inventory( const Inventory & ) = delete;
    Inventory & operator =( const Inventory & ) = delete;

    ~Inventory();

    void insertEnd( int data );

    void clear();

    friend std::ostream & operator <<( std::ostream &, const Inventory & );

private:
    struct Node
    {
        int data;
        Node *next;
    } *head = nullptr, *tail = nullptr;
};

Inventory::~Inventory()
{
    clear();
}

void Inventory::insertEnd( int data )
{
    Node *node = new Node { data, nullptr };

    if ( tail == nullptr )
    {
        head = tail = node;
    }
    else
    {
        tail = tail->next = node;
    }
}

void Inventory::clear()
{
    while ( head != nullptr )
    {
        Node *node = head;
        head = head->next;
        delete node;
    }

    tail = head;
}

std::ostream & operator <<( std::ostream &os, const Inventory &inventory )
{
    for ( Inventory::Node *node = inventory.head; node != nullptr; node = node->next )
    {
        os << node->data << " -> ";
    }

    return os << "null";
}

int main()
{
    Inventory inventory;

    for ( const auto &data : { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } )
    {
        inventory.insertEnd( data );
    }

    std::cout << inventory << '\n';

    return 0;
}

您似乎忘记告诉编译器,
Node*insertEnd(Node*head,int data)
是一个成员函数,而不是自由函数。您想将定义更改为
Node*Inventory::insertEnd(Node*head,int data)
。现在链接器找不到
Inventory::insertEnd
,因为
insertEnd
已经实现了。@user4581301您应该制作并回答,而不是评论。我想我会的。还有两个问题需要解决,这是一个小小的疏忽。我按照@user4581301的建议更新了insertEnd()函数。我在newNode()函数“未定义对'Inventory::newNode(int)的引用”中也遇到了类似的错误,因此我将newNode函数更新为Node Inventory::*newNode(int data)现在我在函数“Node Inventory::*newNode(int)中遇到了此错误\.cpp | |“:|\Inventory.cpp | 24 |错误:无法将“Node*”转换为“Node Inventory::*”,作为回报| | |===构建失败:1个错误,0个警告(0分钟,0秒))=======@tatib这是另一个问题,请就这个特定问题问另一个问题。如您所见,您的评论无法阅读(注释不用于发布长文本和源代码。