为什么我得到一个“无法忽视的空值”错误?

时间:2014-01-22 06:55:22

标签: c++ oop pointers reference void

首先,我想声明我正在处理家庭作业问题,因此如果给出的任何答案不仅仅是答案,我会非常感激,但是解释即可。另外,如果你担心帮助解决家庭作业问题,我只是想让你知道我的导师鼓励我们使用这个网站寻求帮助,所以你不需要觉得你在帮助我作弊!

无论如何,这是问题所在。我正在制作一个基于控制台的小型“游戏”,您可以尝试从开始Location到结束Location找到自己的方式。 Location头文件如下所示:

enum Direction {NORTH, SOUTH, EAST, WEST};

class Location{
    string name;
    bool visited;
    Location* neighbors[4];

public:
    Location();
    Location(string locName);
    string getDescription();
    bool hasNeighbor(Direction dir);
    Location* getNeighbor(Direction dir);
    void setNeighbor(Direction dir,  Location* neighborLoc);
    string getName();
    void setName(string newName);
    bool visit();
    bool getVisited();
};

该计划的基本理念是每个Location都有四个可以链接到的LocationLocation。 “游戏”的目标是让玩家从一个位置开始,在这种情况下,它是“一个深而深的洞穴”,并通过遍历这些void buildMap(Location* startLoc, Location* endLoc)来结束表面。

为了进行设置,我有一个函数void buildMap(Location* startLoc, Location* endLoc){ //Initialize all of the locations on the heap with temporary pointers startLoc = new Location("a deep, dark cave"); endLoc = new Location("the surface"); Location* passage = new Location("a musty passage"); Location* shaft = new Location("a twisting shaft"); Location* alcove = new Location("a dusty alcove"); Location* toSurface = new Location("a passage to the surface"); Location* cavern = new Location("a collapsed cavern"); Location* shore = new Location("the shores of an underground lake"); //Set up the deep, dark, cave's neighbors *startLoc->setNeighbor(NORTH, passage); //IDE changed my "." to a "->"? *startLoc->setNeighbor(EAST, shore); *startLoc->setNeighbor(SOUTH, cavern); //Set up the musty passage's neighbors *passage->setNeighbor(EAST, shaft); *passage->setNeighbor(SOUTH, startLoc); //Set up the twisting shaft's neighbors *shaft->setNeighbor(EAST, alcove); *shaft->setNeighbor(SOUTH, shore); //Set up the dusty alcove's neighbors *alcove->setNeighbor(SOUTH, toSurface); //Set up the passage to the surface's neighbors *toSurface->setNeighbor(NORTH, alcove); *toSurface->setNeighbor(WEST, endLoc); //Set up the collapsed cavern's neighbors *toSurface->setNeighbor(NORTH, startLoc); //Set up the shore's neighbors *toSurface->setNeighbor(NORTH, shaft); *toSurface->setNeighbor(WEST, startLoc); } 来生成整个场景。我面临的问题出现在这个功能中,我不明白问题是什么。对于使用setNeighbor()函数的每一行,我得到错误“无法忽略的空值”。我已经研究过这个错误并发现最常见的原因是程序试图使用一个函数就像它返回一个值一样,但我不知道我在哪里可以做到这一点。以下是我的功能示例:

setNeighbor

如果有帮助,这里也是void Location::setNeighbor(Direction dir, Location* neighborLoc){ neighbors[dir] = neighborLoc; } 功能:

C:\Users\Zachary\Documents\School\CS162\Location\main.cpp:30: error: void value not ignored as it ought to be
             *startLoc->setNeighbor(NORTH, passage);  

以下是我收到的错误示例。它发生在具有相同错误的每条相似行上。

{{1}}

非常感谢您提供解决此错误的任何帮助,如果需要更多信息,请发表评论以便我帮助您。

3 个答案:

答案 0 :(得分:4)

*startLoc->setNeighbor(NORTH, passage);

该行正在尝试取消引用void,但这不起作用。该行应为

startLoc->setNeighbor(NORTH, passage); // note the lack of *

所有setNeighbor次来电都是如此。

答案 1 :(得分:3)

错误似乎在这里:

*startLoc->setNeighbor(NORTH, passage);
...

您必须记住,a->b表示(*a).b。因此,您的代码行实际上意味着(包括运算符优先级):

*((*startLoc).setNeighbor(NORTH, passage));

您要解除引用Location *以获取Location,然后调用方法,该方法返回void,然后您尝试取消引用void,禁止的内容。< / p>

将这些行改为:

startLoc->setNeighbor(NORTH, passage);

这个版本也可以接受(虽然需要额外的括号):

(*startloc).setNeighbor(NORTH, passage);

答案 2 :(得分:2)

*startLoc->setNeighbor(NORTH, passage);

startLoc是指向Location的指针,使用->您访问setNeighbor并返回void,您将其取消引用,这是非法的。我想你的意思是做有效的(*startLoc).setNeighbor(NORTH, passage);。问题源于对运营商.->的误解。

  • 如果变量中有structclass个对象,则可以通过.运算符访问其成员,例如object.member或{{ 1}}。

  • 但是,如果您有指向此类对象的指针,则通常的访问方式是object.member_func()object_ptr->member。这里object_ptr->member_func()取消引用指向访问底层对象成员的指针。

  • 当你执行->时,你会有效地恢复对象本身,因此你可以像使用普通(非指针)可修复*object_ptr一样访问它。

您正在做的是取消引用它两次,一次使用(*object_ptr).member,然后使用->。但是,编译器只接受第一个,它假定从函数返回的内容再次是一个指针,并且您尝试使用*的第二个解除引用来取消引用它。