Когда дело доходит до определения функций, не относящихся к классу, должны ли они обычно присутствовать в заголовочном файле или исходном файле? Что вообще является лучшей практикой? Или это все личные предпочтения?
Всегда старайтесь минимизировать видимость. Если вам нужна ваша функция только в исходном файле, вы можете поместить ее в безымянное пространство имен:
// Your .cpp
namespace
{
void yourHelperFunction( void ) // only visible in the translation unit
{
...
}
}
//
Я хотел прокомментировать, потому что в настоящее время я возвращаюсь домой, но мне нужна более высокая репутация … возможно, я уточню свой ответ позже.
Я обычно выбираю одну из четырех стратегий для вспомогательных функций в C ++, в зависимости от требований повторного использования.
Если это функция, которая требуется только в одном файле .cpp, и она будет использоваться в нескольких местах, поместите ее в пространство анонимных имен в верхней части файла .ccp:
namespace
{
int myHelperFunc()
{
int result = 0;
....
return result;
}
}
...
bool MyClass::someMethod()
{
return 0 != myHelperFunc();
}
void MyClass::someOtherMethod()
{
if (0 == myHelperFunc())
{
for (int i = 0; i < 10; ++i)
std::cout << i << std::endl;
}
}
Это позволяет повторно использовать вспомогательную функцию, но позволяет избежать любых возможных конфликтов имен.
преимущества
Недостатки
Если вспомогательной функции требуется доступ к вашему внутреннему состоянию класса, сделайте его закрытым методом.
int MyClass::myStatefulHelperFunc()
{
int result = 0;
if (IsInitialized())
{
....
}
return result;
}
...
bool MyClass::someMethod()
{
return 0 != myStatefulHelperFunc();
}
void MyClass::someOtherMethod()
{
if (0 == myStatefulHelperFunc())
{
for (int i = 0; i < 10; ++i)
std::cout << i << std::endl;
}
}
преимущества
Недостатки
Если вспомогательная функция может использоваться в нескольких местах в вашей кодовой базе, извлеките ее в свой собственный файл в своем собственном пространстве имен:
HelperFunction.h
namespace ProjectHelpers
{
/**
* \brief Do helpful thing.
*
* \return a helpful integer.
*/
int myHelperFunc();
}
преимущества
Недостатки
Если вспомогательная функция очень мала и ее использование ограничено одной функцией, вы можете создать лямбда-функцию и использовать ее так же, как любую другую функцию, используя функцию алгоритма C ++ (например, std::for_each()
).
преимущества
Недостатки
Другие опции для вспомогательных функций включают статические функции класса и код копирования / вставки. У каждой из вышеперечисленных стратегий есть свои преимущества и недостатки, поэтому вы сами выбираете лучший подход для своей собственной кодовой базы.