错误:无法从节点*转换为节点c ++?

时间:2018-03-25 01:10:08

标签: c++ linked-list

我是c ++的初学者,我正在为学校项目创建自己的InterlacedList类,并且我已经创建了一个Node类:

#include "Node.h"
#include "Student.h"
#include <string>

Node::Node()
{
     this->student = nullptr;
     this->nextName = nullptr;
     this->nextYear = nullptr;
     this->nextGrade = nullptr;
}

Student Node::getStudent()
{
    return this->student;
}

Node Node::getNextName()
{
    return this->nextName;
}

Node Node::getNextYear()
{
    return this->nextYear;
}

Node Node::getNextGrade()
{
    return this->nextGrade;
}

编译好。

但在我的InterlacedList类中:

#include "InterlacedList.h"
#include "Node.h"
#include "Student.h"

InterlacedList::InterlacedList()
{
    this->head = nullptr;
    this->tail = nullptr;
}

Node InterlacedList::getHead()
{
    return this->head;
}

Node InterlacedList::getTail()
{
    return this->tail;
}

我收到此错误: 无法将'((model :: InterlacedList *)this' - &gt; model :: InterlacedList :: head'从'model :: Node *'转换为'model :: Node'

错误:无法转换'((model :: InterlacedList *)this) - &gt; model :: InterlacedList :: tail'从'model :: Node *'转换为'model :: Node'

我的理解是它应该像Node类getter一样工作。 请帮助。

2 个答案:

答案 0 :(得分:2)

查看您的InterlacedList::InterlacedList(),似乎headtail都被定义为指针。您的getHead()会返回一个节点,不是指向Node的指针,这就是错误弹出的原因:您忘了取消引用它。

您可以更改函数,使其返回指针(不要忘记更改头文件中的类定义):

Node* InterlacedList::getHead()

或返回解除引用的对象:

return *(this->head);

但请务必在执行后者之前检查nullptr。此外,如果您这样做,最好返回对Node的引用,而不是返回副本。

答案 1 :(得分:0)

看一下Node的定义。你忘了在问题中显示它,但我的水晶球告诉我它看起来像这样:

class Node {
    // something ...
    Node* head;
    Node* tail;
    // something ...
};

特别注意Node::head(和Node::tail)的类型。类型为Node*。这意味着指向Node指针。

接下来看一下getHead(和getTail)的声明:

Node InterlacedList::getHead()

要特别注意函数的返回类型。它是Node。这与Node*不同。此返回类型表示该函数返回一个新的Node对象。它没有返回指针。

接下来看一下getHead(和getTail)的定义:

return this->head;

好吧,您正在尝试从应该返回Node*的函数返回Node。指针(通常)不可隐式转换为其指向类型。错误很明显:

could not convert .. from ‘model::Node*’ to ‘model::Node’

解决方案:返回类型与函数返回类型匹配的对象。一种可能的解决方案是间接指针:

return *this->head;

另一种方法是更改​​函数的返回类型以匹配要返回的指针。考虑哪个解决方案是您尝试实施的解决方案。