2013-06-14 4 views
0

У меня есть функция, которая вычисляет некоторые средние значения некоторых значений в качестве входных данных, а выходы - это два способа вычисления среднего: среднее значение среднего и логарифмическое.Вызов функции и возврат одного из нескольких из них

void average_function(double nb1, double nb2, double &avr1, double &avr2) 
{ 
.... 
} 

в основной программе: Я просто хочу, чтобы назвать только первую очередь, я имею в виду, avr1, и я не хочу иметь выход avr2. Я думаю, что если это указатель, вы должны указать avr2 = NULL, но не в этом случае.

double avr1; 
average_function(nb1, nb2, avr1, avr2) 

Есть ли способ вывода только avr1 в этой ситуации? Или, я отделяю разные средние функции от двух: один для возврата avr1, а другой для возврата avr2 (что-то, чего я действительно не хочу делать).

+2

Предоставьте две функции: по одному для каждого среднего типа. Это приведет к меньшему путанице. – juanchopanza

ответ

3

Вы должны разделить их на 2 функции. И вы должны возвращать результаты вызывающему абоненту с (шокирующе?) Возвращаемое значение ...

double Average(double nb1, double nb2); 
double LogarithmicMean(double nb1, double nb2); 
1

Я определенно разбить его на две функции, и имеют в среднем качестве параметра возврата этих функций, таких как :

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); 
0

Есть решения, ни одна из которых не является особенно удачной (на самом деле я нахожу оба сомнительными). Но для образовательных целей:

Вы можете сделать функционально перегруженную функцию, которая сбрасывает 2-й параметр

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) 
{ 
    .... 
} 
0

Передача аргумента в качестве указателя, а не вычисление соответствующего среднего, если оно nullptr довольно распространено и абсолютно нормально.

Разумеется, вы, вероятно, должны разделить функциональность на две функции. Мой ответ основан на вашем заявлении, что вы не хотите этого делать. Единственная причина, по которой вы могли бы сохранить ее в одной функции, - это то, что объем обрабатываемых данных настолько велик, что он сдувает кэши процессора, и поэтому было бы желательно, чтобы он проходил только один раз.

+1

Ya, это «абсолютно нормально», если это было в 1999 году. В мире, где вы никогда не знали: могу ли я пройти NULL? Почему я передаю указатель, они собираются его прочитать? хранить его? написать ему? Этот мир ушел. К счастью. Crappy API. – David

+0

Если это const, они будут читать только, если это не должно быть документировано. Этот аргумент применим и к ссылкам. Передающие указатели для указания необязательных аргументов - это неплохой дизайн API как таковой, единственное, что плохо, это использование указателей, в которых ссылки также будут выполнять эту работу. Если API является последовательным в этом отношении, параметр указателя всегда должен интерпретироваться как «может быть нулевым». Хотя я ценю ваше разглагольствование, это не помогает в том, как обстоят дела. –

0

Оператор &, используемый в описании функции, является ссылочным оператором. Это означает, что любые параметры, переданные в вашу функцию, передаются по ссылке, что означает, что любые изменения, внесенные функцией в значение, сохраняются после завершения функции. (параметры, переданные в вашу функцию обычным способом, по значению, эффективно копируются в функцию, любые изменения, которые выполняет функция, не будут применяться к внешнему значению). Ссылка не совсем указатель, поэтому вы не можете передать ее 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 
    } 
} 
Смежные вопросы