C++ 为什么我会得到一个“a”;无效值不应被忽略,应为;错误?

C++ 为什么我会得到一个“a”;无效值不应被忽略,应为;错误?,c++,oop,pointers,reference,void,C++,Oop,Pointers,Reference,Void,首先,我想声明我正在做一个家庭作业问题,因此,如果给出的答案不是简单的答案,而是解释,我将非常感激。另外,如果你担心帮助解决家庭作业问题,我只想让你知道我的导师鼓励我们使用这个网站寻求帮助,所以你不需要觉得你在帮我作弊 无论如何,问题就在这里。我正在制作一个基于控制台的小型“游戏”,在这个游戏中,您可以尝试从起点位置到终点位置。位置头文件如下所示: enum Direction {NORTH, SOUTH, EAST, WEST}; class Location{ string nam

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

无论如何,问题就在这里。我正在制作一个基于控制台的小型“游戏”,在这个游戏中,您可以尝试从起点
位置
到终点
位置
位置
头文件如下所示:

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();
};
该程序的基本思想是,每个
位置
都有四个其他可能的
位置
可以链接到。“游戏”的目标是让玩家从一个位置开始,在这种情况下,它是一个“深而暗的洞穴”,并通过这些
位置
到达地面

为了进行设置,我有一个函数
void buildMap(Location*startoc,Location*endLoc)
,用于生成整个场景。我面临的问题是在这个函数中出现的,我不明白问题是什么。对于setNeighbor()函数的每一行,我都会得到错误“void value not ignored as should”。我研究了这个错误,发现最常见的原因是当程序试图使用一个函数,好像它正在返回一个值,但我不知道我在哪里可以这样做。以下是我的函数示例:

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
函数:

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);  
非常感谢您为解决此错误提供的任何帮助,如果需要更多信息,请留下评论,以便我可以帮助您帮助我

*startLoc->setNeighbor(NORTH, passage);
该行正在尝试取消对无效的
的引用,这将不起作用。这行应该是

startLoc->setNeighbor(NORTH, passage); // note the lack of *
所有的
setNeighbor
调用也是如此

*startLoc->setNeighbor(NORTH, passage);
startOC
是指向
位置的指针,使用
->
访问
setNeighbor
,返回
void
,取消引用,这是非法的。我猜你的意思是做
(*startoc).setNeighbor(北面,通道)这是有效的。该问题源于操作员对
->
的误解

  • 当变量中有
    结构
    对象时,可以通过
    操作符访问其成员,如
    对象.member
    对象.member\u func()

  • 但是,如果您有指向这样一个对象的指针,那么通常访问它的方式是
    object\u ptr->member
    object\u ptr->member\u func()。此处
    ->
    取消对指针的引用,该指针允许访问基础对象的成员

  • 当您执行
    *object\u ptr
    时,您可以有效地获取对象本身,因此您可以像使用普通(非指针)变量
    (*object\u ptr).member
    一样访问它


您要做的是两次取消引用,一次使用
->
,然后使用
*
。但是,编译器只接受第一个,并且它假定从函数返回的还是指针,并且您正试图通过
*

使用第二个解引用来解引用。错误似乎在这里:

*startoc->setNeighbor(北面,通道);
...
你必须记住,
a->b
意味着
(*a).b
。因此,您的代码行实际上意味着(包括运算符优先级):

*((*startoc.setNeighbor(北面,通道));
您正在取消引用
位置*
以获取
位置
,然后调用一个方法,该方法返回
void
,然后尝试取消引用
void
,这是禁止的

将这些行更改为:

startoc->setNeighbor(北面,通道);
此版本也可以接受(尽管需要附加括号):

(*startoc).setNeighbor(北面,通道);

在导致错误的行中包含准确的错误消息。提示:*运算符正在对方法调用的结果进行操作。您可能会重新检查“一元*”和“->”…如果您不将*放在变量之前怎么办?他不是在解引用
位置
对象,他是在解引用
setNeighbor()
成员函数(无效)的“返回值”。这似乎起到了作用。你能解释一下为什么会这样吗?我们今天刚刚讨论了去引用指针之类的东西,所以它仍然有点混乱。我原以为既然
startOC
是一个指向
位置的指针,我需要取消对它的引用以调整实际数据?@zherman您需要这样做,但您要做两次-第一次是由
->
操作符执行,第二次是由前面的
*
操作符执行,这实际上适用于方法调用的结果。请阅读其他答案。@zHerman除了Spook所说的以外,
(*ptr)。somefunc()
取消对指针的引用并调用其成员函数
somefunc
ptr->somefunc()
做同样的事情。