Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不存在从到*的适当转换_C++_Class_Data Structures_Linked List_Switch Statement - Fatal编程技术网

C++ 不存在从到*的适当转换

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;

我正在使用链表来操作已排序的列表。但是,在我的函数PutUser中,调用另一个函数来比较两个用户时出现错误。我不知道该怎么做或如何处理错误

这是我的NodeUser结构(为链表创建节点):

然后我有一个函数,假设它创建一个新节点并将一个用户放入列表中

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))