(编辑版)
我目前正在编码二进制搜索树算法。 (使用xCode IDE) 我从txt文件中获取数据并将其作为binarysearchtree插入。 这是来自txt文件的数据样本。
3800 Lee,Victor; 2.83000布朗,乔安妮; 4.0
正如您在student.h中看到的,有2个变量是id和student。 Id包含数据“3800”,学生包含“Lee,Victor; 2.8”。 txt的每一行都视为一个根。 现在,我必须使用id(例如“3800”)的唯一键进行搜索,如果在树中找到它,则打印出来。 我有5个文件,BinaryNode.h,BinaryTree.h,BinarySearchTree.h,Student.h,main.cpp。 所有3个二进制头文件都使用模板,Student.h没有模板。 所以,这是我的主要内容。
int main()
{
BinarySearchTree<Student> tree;
getData(tree); (I didn't include getData part, but consider tree has txtfile data.)
bool found = false;
char input;
do
{
cout << "Enter a key letter to access to a corresponding menu." << endl << endl;
cout << "T – Print tree as an indented list" << endl;
cout << "S – Search by a unique key (student ID)" << endl;
cout << "B – Tree Breadth-First Traversal: Print by level" << endl;
cout << "D – Depth-First Traversals: inorder, preorder, postorder" << endl;
cout << "R – Find the longest branch and print it (from leaf to root)" << endl;
cout << "H – Help" << endl;
cout << "Q – Quit" << endl << endl;
cout << "Input: ";
cin >> input;
cout << endl;
if(input == 'T' || input == 'S' || input == 'B' || input == 'D' || input == 'R' || input == 'H' || input == 'Q' || input == 'A')
{
if(input == 'T')
{
//print tree as indented
}
else if(input == 'S')
{
//search by student ID
Student *result = new Student;
int id;
cout << "Enter the student ID to search the matching student." << endl;
cin >> id;
result->setId(id);
found = tree.getEntry(*result);
}
我将输入数据输入结果并尝试搜索数据。
//公共函数定义中的getEntry函数
template<class ItemType>
bool BinarySearchTree<ItemType>::getEntry(ItemType& anEntry)
{
BinaryNode<ItemType>* returnedItem = findNode(BinaryTree<ItemType>::rootPtr, anEntry);
if (returnedItem)
{
anEntry = returnedItem->getItem();
return true;
}
else return false;
}
// findNode function
template<class ItemType>
BinaryNode<ItemType>*
BinarySearchTree<ItemType>::findNode(BinaryNode<ItemType>* nodePtr,
ItemType & target)
{
ItemType result = result.getId(); <------- ******error here*******
ItemType root = nodePtr->getItem().getId();
if (nodePtr == nullptr)
return nullptr;
if (result == root)
return root;
if (result > root)
root = findNode(nodePtr->getRightPtr(), target);
else
root = findNode(nodePtr->getLeftPtr(), target);
return root;
}
我的findNode函数出错了。
- &gt;没有可行的从'int'转换为'Student'
// Student.h
class Student
{
private:
int id;
std::string name;
public:
Student() { id = 0; name = ""; }
Student(int newId, std::string newName) { id = newId; name = newName; }
friend bool operator >= (const Student l, const Student& r)
{
return std::tie(l.id, l.name) < std::tie(r.id, r.name);
}
friend bool operator == (const Student l, const Student& r)
{
return std::tie(l.id, l.name) < std::tie(r.id, r.name);
}
friend bool operator < (const Student l, const Student& r)
{
return std::tie(l.id, l.name) < std::tie(r.id, r.name);
}
friend bool operator > (const Student l, const Student& r)
{
return std::tie(l.id, l.name) < std::tie(r.id, r.name);
}
/*
Student& operator = (Student& t_id)
{
if(this != &t_id)
id = t_id.getId();
return *this;
}
*/
void getStudent() { std::cin >> id; }
int getId() const { return id; }
void setId(int t_id) { id = t_id; }
std::string getName() const { return name; }
void setName(std::string t_name) { name = t_name; }
//ItemType getGpa() const { return gpa; }
//virtual void setGpa(std::string t_gpa) { gpa = t_gpa; }
我需要=运算符来解决这个问题吗? 实际上,我创建了=运算符但是如果我启用了=运算符代码, 其他函数中具有等号的其他代码 遇到错误。 (没有可行的超载'=')
如何修复此错误? 谢谢你的帮助。
答案 0 :(得分:0)
错误只表示您没有定义operator=
,因此您可以将int
或string
分配给Student
。 getId()
和getName()
分别返回int
和string
,并且您尝试将结果分配给ItemType
,在您的情况下Student
}。
您还没有学生构造函数使用int
或string
,这让我觉得您可能不希望从int
或{{1到string
(我个人不建议)。
所以:
Student
和getId()
之外的另一个函数(我认为是这样的)getName()
和getId()
函数错误,应返回getName()
以符合模板要求要解决的一个选择是:
Student
调用构造函数ItemType x(a.getId(), a.getName());
和int
。请注意,我更改了变量名称,因为您的代码确实没有意义:您将string
分配给您刚定义的result.getId()
!!
result
无效的原因是您没有将operator=
引用作为参数,因此无法使用const
对象const
的右侧,生成新错误。但是,修复它不会使=
和int
工作,只要您没有隐式构造函数来执行这些操作。
您的代码中还有许多其他奇怪的内容,例如您的string
方法不是getter,您应该以不同的方式命名,并且可能会将getStudent()
引用作为参数或用法在构造函数中使用assignement而不是初始化列表:
istream
或者您的Student() : id(0), name("") {}
Student(int newId, std::string newName) : ud(newId), name(newName) {}
,operator>=
和operator>
实际上与operator==
进行了比较。