我是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一样工作。 请帮助。
答案 0 :(得分:2)
查看您的InterlacedList::InterlacedList()
,似乎head
和tail
都被定义为指针。您的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;
另一种方法是更改函数的返回类型以匹配要返回的指针。考虑哪个解决方案是您尝试实施的解决方案。