C++ 未定义对'的引用;库存:插入端(节点*,int)和#x27;
尝试构建/编译程序时出现“未定义引用”错误: obj\Debug\main.o | |在函数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++很陌生。我做错了什么?我怎样才能修好它? 我觉得跟我的头有关系吗?但我真的搞不懂是
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这是另一个问题,请就这个特定问题问另一个问题。如您所见,您的评论无法阅读(注释不用于发布长文本和源代码。