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()
做同样的事情。