将方法从返回更改为无效
Change method from return to void
我被要求用c ++制作一个迷宫游戏(使用代码块)。我想通了大部分,但卡在迷宫课的一种方法上。我有这个功能可以说,在你没有墙的任何人方向(上、下、左、右)旅行。
int Maze::mazeTraversal(int a, int b)
{
// If a,b is outside maze, return false.
if ( a < 0 || a > MCOLS - 1 || b < 0 || b > NROWS - 1 ) return FALSE;
// If a,b is the goal, return true.
if ( maze[b][a] == 'G' ) return TRUE;
// If a,b is not open, return false.
if ( maze[b][a] != '0' && maze[b][a] != 'S' ) return FALSE;
// Mark a,b part of solution path.
maze[b][a] = 'x';
// If find_path North of a,b is true, return true.
if ( mazeTraversal(a, b - 1) == TRUE ) return TRUE;
// If find_path East of a,b is true, return true.
if ( mazeTraversal(a + 1, b) == TRUE ) return TRUE;
// If find_path South of a,b is true, return true.
if ( mazeTraversal(a, b + 1) == TRUE ) return TRUE;
// If find_path West of a,b is true, return true.
if ( mazeTraversal(a - 1, b) == TRUE ) return TRUE;
// Unmark a,b as part of solution path.
maze[b][a] = '0';
return FALSE;
}
我将这个函数调用为:
Maze mo(maze,12); //creating maze game with 12/12 array
mo. mazeTraversal(0,2) // because the entry point is in 0,2 position of the game.
我刚刚意识到我被要求将这个迷宫穿越作为void
.没有任何回报。我的脑子在爆炸。除了一些创意。
使用:
void Maze::mazeTraversal(int a, int b, bool& Status)
然后而不是return
内部函数使用:-
Status = false; // or true
或者使用类内部bool Status
的数据成员并更新其值
class Maze{
public :
bool Status;
//..
void Maze::mazeTraversal(int a, int b);
//...
};
如果您的请求声明不得修改函数的签名,则签名不包含返回类型,因此,您可以更改返回类型。如果作业没有说明有关签名的任何信息,则上游已经发布了解决方案:
- 添加一个按引用参数(不是指针,这很麻烦,真的不需要)
- 添加您在某个"状态"函数中维护和返回的内部状态。
这些是我会研究的解决方案。无论哪种方式,您都必须调整遍历函数的实现。由于您的迷宫对象似乎是有状态的(即:确实保持了一些内部状态,以了解它到达的位置),因此第二个更有意义。
这是另一种解决方案,它不会更改您的函数签名,但它根本不返回任何内容:
bool g_Status = true;
void Maze::mazeTraversal(int a, int b)
{
if ( a < 0 || a > MCOLS - 1 || b < 0 || b > NROWS - 1 ) // If a,b is outside maze, return false.
g_Status=false;
else if ( maze[b][a] == 'G' ) // If a,b is the goal, return true.
g_Status=true;
else if ( maze[b][a] != '0' && maze[b][a] != 'S' ) // If a,b is not open, return false.
g_Status=false;
else{
maze[b][a] = 'x'; // Mark a,b part of solution path.
mazeTraversal(a, b - 1);
if (!g_Status) // If find_path North of a,b is true, return true.
mazeTraversal(a + 1, b); // If find_path East of a,b is true, return true.
if (!g_Status)
mazeTraversal(a, b + 1); // If find_path South of a,b is true, return true.
if (!g_Status)
mazeTraversal(a - 1, b); // If find_path West of a,b is true, return true.
if (!g_Status)
maze[b][a] = '0'; // Unmark a,b as part of solution path.
}
}
你可以这样写代码:
void Maze::mazeTraversal(int a, int b,bool* retValue)
{
// If a,b is outside maze, *retValue = false.
if ( a < 0 || a > MCOLS - 1 || b < 0 || b > NROWS - 1 ) {
*retValue= FALSE;
return;
}
// If a,b is the goal, return true.
if ( maze[b][a] == 'G' ) {
*retValue= TRUE;
return;
}
// If a,b is not open, return false.
if ( maze[b][a] != '0' && maze[b][a] != 'S' ) {
*retValue= FALSE;
return;
}
// Mark a,b part of solution path.
maze[b][a] = 'x';
// If find_path North of a,b is true, return true.
bool* ret1;
mazeTraversal(a + 1, b,ret1)
if ( *ret1 == TRUE ) {
*retValue= TRUE;
return;
}
// If find_path East of a,b is true, return true.
bool* ret2;
mazeTraversal(a + 1, b,ret2);
if ( *ret2 == TRUE ) {
*retValue= TRUE;
return;
}
// If find_path South of a,b is true, return true.
bool* ret3;
mazeTraversal(a, b + 1,ret3);
if ( *ret3 == TRUE ) {
*retValue= TRUE;
return;
}
// If find_path West of a,b is true, *retValue= true.
if ( mazeTraversal(a - 1, b) == TRUE ) {
*retValue= TRUE;
return;
}
// Unmark a,b as part of solution path.
maze[b][a] = '0';
*retValue= FALSE;
}
现在创建一个全局变量:
bool* retvalue;
此变量将始终保存返回值,无需从函数返回
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 枚举进程模块在有效句柄上返回无效句柄
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- FFMPEG:sws_scale返回错误:切片参数 0, 2160 无效
- 自动返回类型匹配无效
- Gmock:返回无效值
- 具有引用返回类型的重写方法上的协变返回类型无效
- cppcheck 抱怨危险地使用 c_str(). c_str() 返回的值在此调用后无效
- cpp 检查抱怨危险使用 c_str(). c_str() 返回的值在本次调用后无效,如何解决?
- 对"无效的抽象返回类型"进行故障排除
- C++ 安全数组在从 c# COM dll 返回时具有无效数据
- 访问冲突投射到无效*并返回
- 将uint64_t转换为无效*并返回
- 返回对象时从'const DList<int>* const'到 'DList<int>*' [-fallowive] 的转换无效
- 从模板函数返回默认构造或无效
- get 函数返回无效值
- 错误:二进制表达式('float' 和 'float')返回的无效操作数 (x & (1 << 31)) == 0
- 发布信号量返回错误 6(无效句柄)
- 获取控制权到达非无效函数警告的末尾,尽管我在 th 函数中有返回语句
- 无效 ** 等同于无效 * 返回