C++ 不存在从到*的适当转换
我正在使用链表来操作已排序的列表。但是,在我的函数PutUser中,调用另一个函数来比较两个用户时出现错误。我不知道该怎么做或如何处理错误 这是我的NodeUser结构(为链表创建节点): 然后我有一个函数,假设它创建一个新节点并将一个用户放入列表中C++ 不存在从到*的适当转换,c++,class,data-structures,linked-list,switch-statement,C++,Class,Data Structures,Linked List,Switch Statement,我正在使用链表来操作已排序的列表。但是,在我的函数PutUser中,调用另一个函数来比较两个用户时出现错误。我不知道该怎么做或如何处理错误 这是我的NodeUser结构(为链表创建节点): 然后我有一个函数,假设它创建一个新节点并将一个用户放入列表中 void SortedList::PutUser(User* user) { NodeUser* newNode; / NodeUser* previousPointer; NodeUser* location;
void SortedList::PutUser(User* user) {
NodeUser* newNode; /
NodeUser* previousPointer;
NodeUser* location;
bool moreToSearch;
location = topOfList;
previousPointer = NULL;
moreToSearch = (location != NULL);
while (moreToSearch) {
switch (user->comparedTo(location->user)) {
case GREATER:
previousPointer = location;
location = location->next;
moreToSearch = (location != NULL);
break;
case LESS:
moreToSearch = false;
break;
}
}
newNode = new NodeUser;
newNode->user = user;
if (previousPointer == NULL) {
newNode->next = topOfList;
topOfList = newNode;
}
else {
newNode->next = location;
previousPointer->next = newNode;
}
length++;
}
我在以下位置得到错误(具体位置用红色下划线(错误)):
如何修复开关上的错误?快速修复方法是
RelationType与(用户常量和用户常量)常量比较;
或者至少
开关(用户->比较到(&位置->用户))
指针不应过度使用。您正试图传递一个
用户
对象,其中需要用户*
指针
没有理由通过指针将User
对象传递到SortedUserType::PutUser()
或User::comparedTo()
。改为通过引用传递:
类用户{
公众:
...
比较到(const User和aUser)const的关系类型;
...
};
void SortedUserType::PutUser(常量用户和用户){
...
while(moreToSearch){
开关(user.comparedTo(位置->用户)){
...
}
...
newNode=newnodeuser;
新建节点->用户=用户;
...
}
然后,在尝试将用户*
分配给用户
时,代码将失败,因此您需要取消对指针的引用:新节点->用户=*用户;
“指针不应过度使用”-同意,在这种情况下,引用会更有意义。你的理解是正确的。你应该更喜欢引用而不是指针来代替不应该是空的东西,就像这个例子中一样。传递一个指针是一个C方式,在不复制它的情况下传递一个对象。传递引用是首选的C++方式。(除非C语言中不存在指针),除非你真的需要一个指针(因为它可以是空的,或者与传统C代码兼容)。这并不奇怪。很多老师倾向于用C++中的“C”类方法来教他们,他们不教真正的C++,除非他们关注的是基础知识而不是更高级别的C++概念。(如引用而不是指针,使用std::list
而不是手动链表,std::string
而不是char[]
等)。请不要故意破坏您的问题。
void SortedList::PutUser(User* user) {
NodeUser* newNode; /
NodeUser* previousPointer;
NodeUser* location;
bool moreToSearch;
location = topOfList;
previousPointer = NULL;
moreToSearch = (location != NULL);
while (moreToSearch) {
switch (user->comparedTo(location->user)) {
case GREATER:
previousPointer = location;
location = location->next;
moreToSearch = (location != NULL);
break;
case LESS:
moreToSearch = false;
break;
}
}
newNode = new NodeUser;
newNode->user = user;
if (previousPointer == NULL) {
newNode->next = topOfList;
topOfList = newNode;
}
else {
newNode->next = location;
previousPointer->next = newNode;
}
length++;
}
switch (user->comparedTo(location->user))