我注意到我在不传递参数方面遇到了问题
I've noticed I have a problem with NOT passing arguments
我是一名自学成才的 C++ 程序员。我主要学习 UE4,但我还有很长的路要走。我在学校学习计算机科学,我在 CSC 211(我猜那是第二阶段?如果 class 数字不是通用的)。我注意到 class 我的老师和其他学生经常争论不休。很多,我的意思是很多。例如,我们有一个实验室,可以在有人输入他们想在餐厅内吃什么后创建一张支票。我最终被卡住了并查找了它。我看到了很多东西,例如:void CreateMenu(Menu MenuArray[])
所以我最终按照教程进行操作,一切都正确。但是当我编程时,我会做很多这样的事情(来自我的 UE4 的代码)
void AFPSCharacter::ServerFire_Implementation()
{
if (Item && Item->bPickedUp) {
if (GetLocalRole() == ROLE_Authority) {
NetFire();
UE_LOG(LogTemp, Warning, TEXT("Server Fire"));
}
}
}
我知道这段代码看起来会好很多,我想我的问题是:
你怎么知道什么时候传递参数?
即使当时没有使用变量,为什么还要传递参数?
如果 MenuArray[] 的变量已经存在并且您可以不传递参数直接更新它,void CreateMenu()
和 void CreateMenu(Menu MenuArray[])
有什么区别?
我能想到的“不传递参数”的方式有两种:
- 编辑一个class成员变量
- 编辑一个全局变量(或者至少是一个对你的函数来说是“全局”的变量,这意味着函数隐含地知道它)
如果您想了解第一个要点(成员与参考参数),那将是一个更具风格的答案,但我认为您在谈论第二个要点。
第二个要点(参数与全局)仍然是风格问题,但问题与风格而非功能有关。简短的回答是不惜一切代价避免使用全局变量。这包括您不一定认为描述为全局变量,但函数隐式知道的变量(在与函数相同的范围内创建)。
这回答了你的第一个问题。你的第二个和第三个问题基本上是“为什么?”。我能想到的有几个原因:
- 它使您的函数的作用更加明显。
- 您现在可以将您的函数重用于其他目的
一旦您开始从事大型甚至中型项目,第一点就会变得非常明显。你想让函数的作用变得显而易见。如果您修改参考参数,它会自动执行此操作。更好的方法是从函数返回一个值,并根据该值设置变量:
Menu* CreateMenu()
如果您的函数只是修改它们恰好可以访问的数据,您将很难跟踪哪个函数对哪个变量做了什么。
第二点进入功能点:可重用性。
void CreateMenu()
可以精确修改您在函数内指定的变量。
void CreateMenu(Menu Menus[])
可以修改您碰巧传入的任何菜单数组。假设您需要在某处创建另一个菜单。部分逻辑(并非全部)将与此版本的 CreateMenu 共享。想象一下,你需要再创建 10 个菜单......想象一下,你突然需要更改菜单创建逻辑,在执行了 10 个版本的 CreateMenu 之后......
简而言之,传递参数可以让您的函数在生产线上重复使用,这可以为您节省大量工作。
直接接触第二个问题(既然传递变量的原因很清楚),函数就是机器。它根据给定的输入做一些事情。如果您传递的参数不是机器为您提供所需内容所必需的参数,您应该考虑重写您的函数。如果参数只是“有时”是必需的,而其他时候它们什么都不做,则可能是您的函数编写不当。也有可能是值得的。
我是一名自学成才的 C++ 程序员。我主要学习 UE4,但我还有很长的路要走。我在学校学习计算机科学,我在 CSC 211(我猜那是第二阶段?如果 class 数字不是通用的)。我注意到 class 我的老师和其他学生经常争论不休。很多,我的意思是很多。例如,我们有一个实验室,可以在有人输入他们想在餐厅内吃什么后创建一张支票。我最终被卡住了并查找了它。我看到了很多东西,例如:void CreateMenu(Menu MenuArray[])
所以我最终按照教程进行操作,一切都正确。但是当我编程时,我会做很多这样的事情(来自我的 UE4 的代码)
void AFPSCharacter::ServerFire_Implementation()
{
if (Item && Item->bPickedUp) {
if (GetLocalRole() == ROLE_Authority) {
NetFire();
UE_LOG(LogTemp, Warning, TEXT("Server Fire"));
}
}
}
我知道这段代码看起来会好很多,我想我的问题是:
你怎么知道什么时候传递参数?
即使当时没有使用变量,为什么还要传递参数?
如果 MenuArray[] 的变量已经存在并且您可以不传递参数直接更新它,void CreateMenu()
和 void CreateMenu(Menu MenuArray[])
有什么区别?
我能想到的“不传递参数”的方式有两种:
- 编辑一个class成员变量
- 编辑一个全局变量(或者至少是一个对你的函数来说是“全局”的变量,这意味着函数隐含地知道它)
如果您想了解第一个要点(成员与参考参数),那将是一个更具风格的答案,但我认为您在谈论第二个要点。
第二个要点(参数与全局)仍然是风格问题,但问题与风格而非功能有关。简短的回答是不惜一切代价避免使用全局变量。这包括您不一定认为描述为全局变量,但函数隐式知道的变量(在与函数相同的范围内创建)。
这回答了你的第一个问题。你的第二个和第三个问题基本上是“为什么?”。我能想到的有几个原因:
- 它使您的函数的作用更加明显。
- 您现在可以将您的函数重用于其他目的
一旦您开始从事大型甚至中型项目,第一点就会变得非常明显。你想让函数的作用变得显而易见。如果您修改参考参数,它会自动执行此操作。更好的方法是从函数返回一个值,并根据该值设置变量:
Menu* CreateMenu()
如果您的函数只是修改它们恰好可以访问的数据,您将很难跟踪哪个函数对哪个变量做了什么。
第二点进入功能点:可重用性。
void CreateMenu()
可以精确修改您在函数内指定的变量。
void CreateMenu(Menu Menus[])
可以修改您碰巧传入的任何菜单数组。假设您需要在某处创建另一个菜单。部分逻辑(并非全部)将与此版本的 CreateMenu 共享。想象一下,你需要再创建 10 个菜单......想象一下,你突然需要更改菜单创建逻辑,在执行了 10 个版本的 CreateMenu 之后......
简而言之,传递参数可以让您的函数在生产线上重复使用,这可以为您节省大量工作。
直接接触第二个问题(既然传递变量的原因很清楚),函数就是机器。它根据给定的输入做一些事情。如果您传递的参数不是机器为您提供所需内容所必需的参数,您应该考虑重写您的函数。如果参数只是“有时”是必需的,而其他时候它们什么都不做,则可能是您的函数编写不当。也有可能是值得的。