2011-12-27 3 views
1

Я разрабатываю библиотеку некоторых функций утилиты на C++. У меня есть сомнения относительно сигнатур функций в этой библиотеке. Если функция принимает некоторые параметры и возвращает значение, должна ли переменная, в которую сохраняется результат этой функции, передаваться как параметр этой функции? Как я должен обрабатывать условия ошибки и возвращать значения для ошибок?Решения о разработке функций

+0

Вы отметили это как «C++» и «C». Выберите один, так как ответ может быть очень различным для каждого. –

+0

Это вопрос выбора и перспективы, поэтому следуйте инструкциям по кодированию, изложенным вашей организацией. –

+0

@ OliCharlesworth: Было бы здорово, если бы вы могли рассказать мне о различиях на каждом из языков, спасибо. –

ответ

2

Для C++ вы должны вернуть результат и обработать ошибки с исключениями.

int calc_with_error() { 
    throw yourExceptionClass("Message"); 
} 
int calc() { 
    return 5; 
} 
int main() { 
    int tmp=calc(); 
    cout << calc; 
} 

Но результат затем копируется из функции в вызывающий контекст. С примитивными типами данных это самый быстрый способ. Но когда у вас есть сложные datastructures, это может быть быстрее передать ссылку на параметр результата - хотя это не так, чистый код, как выше решения, Примером может быть:

void calc(vector<int> &result) { 
    result.clean(); 
    result.add(5); 
} 
int main() { 
    vector<int> tmp; 
    calc(tmp); 
    //Do something with the vector 
} 
+0

Не забывайте о Оптимизации возвращаемого значения: копии возвращаемых значений часто оптимизируются. –

1

Существует несколько вариантов, и это в значительной степени зависит от предпочтений.
Одна вещь, которую вы должны сделать, - это в большинстве случаев разделить выходные и ошибки.
Обычно полезно возвращать успех/ошибку в качестве возвращаемого значения и возвращать данные в выходной параметр, передаваемый по ссылке.

Не делайте этого:
1. Используйте «магические значения» в качестве индикатора ошибки.
2. Используйте глобальные переменные для возврата данных.

+0

Это верно для C, что меньше для C++. –

+0

Не могли бы вы объяснить, как это происходит на C++? Благодарю. –

+0

@RakeshK: Исключения не отображаются в сигнатуре функции. –

1

Люди часто говорят мне, чтобы не вернуться значения ошибки, потому что это не самая лучшая практика. Лучше всего вы бросаете исключения, лучше всего обрабатывать, чем коды ошибок. Кроме того, выходные параметры хороши, я использую их больше всего для больших данных, для простых возвратов возвращаемое значение должно быть полезным.

Чтобы показать вам, конечно, это не так хорошо в дизайне:

void checkSomething(bool& output) 
{ 
    output = doCheckages(); 
} 

, что гораздо лучше

bool checkSomething() 
{ 
    return doCheckages(); 
} 

но если Youre обработка большого класса/структуры, и вы знаете, что вы не хотите иметь много примеров, может быть лучше передать его как выходной параметр.

Смежные вопросы