C++ 调用一个函数并从多个函数中获取一个返回值
我有一个函数,它计算一些值的平均值作为输入,输出是两种计算平均值的方法:正态平均值和对数平均值C++ 调用一个函数并从多个函数中获取一个返回值,c++,visual-studio-2010,function,declaration,C++,Visual Studio 2010,Function,Declaration,我有一个函数,它计算一些值的平均值作为输入,输出是两种计算平均值的方法:正态平均值和对数平均值 void average_function(double nb1, double nb2, double &avr1, double &avr2) { .... } 在主程序中:我只想调用第一个返回,我的意思是,avr1,我不想有输出avr2。我认为,如果它是一个指针,您应该将其设置为avr2=NULL,但在这种情况下不应设置为NULL double avr1; average_fu
void average_function(double nb1, double nb2, double &avr1, double &avr2)
{
....
}
在主程序中:我只想调用第一个返回,我的意思是,avr1,我不想有输出avr2。我认为,如果它是一个指针,您应该将其设置为avr2=NULL,但在这种情况下不应设置为NULL
double avr1;
average_function(nb1, nb2, avr1, avr2)
在这种情况下,有没有办法只输出avr1?或者,我将把不同的平均函数分为两个:一个返回avr1,另一个返回avr2(我真的不想这么做)。您应该将它们分为两个函数。您应该将结果返回给调用者,并带有(令人震惊的?)返回值
double Average(double nb1, double nb2);
double LogarithmicMean(double nb1, double nb2);
您应该将它们分为两个函数。您应该将结果返回给调用者,并带有(令人震惊的?)返回值
double Average(double nb1, double nb2);
double LogarithmicMean(double nb1, double nb2);
我肯定会将其分解为两个函数,并将平均值作为这些函数的返回参数,例如:
double normalAverage(double nb1, double nb2);
double logarithmicMean(double nb1, double nb2);
...
double normalAvg = normalAverage(15.25, 99.12);
double logMean = logarithmicMean(15.25, 99.12);
我肯定会将其分解为两个函数,并将平均值作为这些函数的返回参数,例如:
double normalAverage(double nb1, double nb2);
double logarithmicMean(double nb1, double nb2);
...
double normalAvg = normalAverage(15.25, 99.12);
double logMean = logarithmicMean(15.25, 99.12);
有一些解决方案,但没有一个是特别有益的(事实上,我觉得两者都有问题)。但出于教育目的: 您可以创建一个函数重载函数来丢弃第二个参数
void average_function(double nb1, double nb2, double &avr1, double &avr2)
{
....
}
void average_function(double nb1, double nb2, double &avr1)
{
double dummy;
average_function(nb1, nb2, avr1, dummy);
}
此外,如果在某处定义了全局双精度值,则可以将其用作默认参数:
static double dummy;
void average_function(double nb1, double nb2, double &avr1, double &avr2= dummy)
{
....
}
有一些解决方案,但没有一个是特别有益的(事实上,我觉得两者都有问题)。但出于教育目的: 您可以创建一个函数重载函数来丢弃第二个参数
void average_function(double nb1, double nb2, double &avr1, double &avr2)
{
....
}
void average_function(double nb1, double nb2, double &avr1)
{
double dummy;
average_function(nb1, nb2, avr1, dummy);
}
此外,如果在某处定义了全局双精度值,则可以将其用作默认参数:
static double dummy;
void average_function(double nb1, double nb2, double &avr1, double &avr2= dummy)
{
....
}
将参数作为指针传递,如果它是
nullptr
,则不计算相应的平均值,这是非常常见且绝对正确的
但是,在设计方面,您可能应该将功能分为两个功能。我的回答是基于你说你不想这样做。将其保存在一个函数中的唯一原因是,如果要处理的数据量太大,以致于CPU缓存被吹走,因此只需要遍历一次。将参数作为指针传递,如果它是
nullptr
,则不计算相应的平均值是非常常见的,而且绝对正确
但是,在设计方面,您可能应该将功能分为两个功能。我的回答是基于你说你不想这样做。将其保存在一个函数中的唯一原因是,如果要处理的数据量太大,以致于CPU缓存被吹走,因此只需要遍历一次。在函数声明中使用的
&
运算符是引用运算符。这意味着传递到函数中的任何参数都是通过引用传递的,这意味着函数对值所做的任何更改都将在函数结束后保留。(以正常方式通过值传递到函数中的参数将有效地复制到函数中;函数所做的任何更改都不会应用于外部值)。引用不完全是指针,因此不能将其传递为NULL
最好的选择是分离这些功能。最好是让每个函数都做一件“事情”,如果有不同的事情要做,就用不同的方式去做
如果仍然只想使用一个函数,则可以将无效值传递给&avr2
(例如,如果该值实际上无效,则传递给0),并在函数内传递该值,无论该值是否为0;如果是,则执行不涉及使用&avr2
的功能操作。如果不是0,请使用&avr2
void average_function(double nb1, double nb2, double &avr1, double &avr2)
{
if(avr2==0)
{
//non-avr2 option
} else {
//avr2 option
}
}
在函数声明中使用的
&
运算符是引用运算符。这意味着传递到函数中的任何参数都是通过引用传递的,这意味着函数对值所做的任何更改都将在函数结束后保留。(以正常方式通过值传递到函数中的参数将有效地复制到函数中;函数所做的任何更改都不会应用于外部值)。引用不完全是指针,因此不能将其传递为NULL
最好的选择是分离这些功能。最好是让每个函数都做一件“事情”,如果有不同的事情要做,就用不同的方式去做
如果仍然只想使用一个函数,则可以将无效值传递给&avr2
(例如,如果该值实际上无效,则传递给0),并在函数内传递该值,无论该值是否为0;如果是,则执行不涉及使用&avr2
的功能操作。如果不是0,请使用&avr2
void average_function(double nb1, double nb2, double &avr1, double &avr2)
{
if(avr2==0)
{
//non-avr2 option
} else {
//avr2 option
}
}
提供两个功能,每个平均类型一个。这将减少混淆。提供两个函数,每个平均类型一个。这将减少混乱。是的,如果这是1999年,那“绝对没问题”。在这个你永远不知道的世界里:我能通过空值吗?为什么我要传递一个指针,他们会读吗?存储它?写信给它?那个世界已经不复存在了。谢天谢地糟糕的API。如果它是常量,他们只会读取,如果不是,应该记录下来。这个论点也适用于引用。传递指针以指示可选参数本身并不是坏的API设计,唯一不好的是在引用也能完成工作的地方使用指针。如果API在这方面是一致的,指针参数总是被解释为“可能为null”。虽然我很欣赏你的咆哮,但这无助于事情的发展。是的,如果这是1999年的话,那“绝对没问题”。在这个你永远不知道的世界里:我能通过空值吗?为什么我要传递一个指针,他们会读吗?存储它?写信给它?那个世界已经不复存在了。谢天谢地糟糕的API。如果是cons