Мой вопрос носит чисто организационный характер, и поэтому я понимаю, что потенциальные ответы могут быть субъективными по своему характеру. После многих лет работы с C # я наконец вернулся к C ++ и пытаюсь привыкнуть к правильной организации файлов.
По сути, я хочу знать, где лучше всего определять предикаты и функциональные объекты. В настоящее время я использую простой функциональный объект для алгоритма STL в одном классе. Этот функциональный объект не будет полезен для любого другого класса, так где я могу его поместить? Я помещаю это в то же самое пространство имен и в файл заголовка или в файл .cpp? Я помещаю это в анонимное пространство имен, или я помещаю это в его собственный файл header / cpp?
Заранее благодарю за любые ответы,
Kevin
Это действительно зависит от предиката, если бы он мог быть полезен конечному пользователю, я бы поместил его объявление в заголовок, в идеале как бесплатную функцию с помощью const ref, и реализацию в исходном файле.
Если это часть программы (а не библиотеки), то для простоты я бы тоже сделал то же самое.
Если он предназначен исключительно для внутреннего использования, и вы НЕ хотите, чтобы конечный пользователь использовал его, вы можете поместить его в анонимное пространство имен в исходном файле.
Я предполагаю, что вы не можете использовать C ++ 11, в противном случае я бы предложил использовать лямбды везде, где это возможно;), так как у меня нет хороших аргументов, вот что я обычно делаю:
Если я использую предикат только в одной функции, я объявляю его в функции. Если я использую его только в одном кодовом файле, я помещаю его в пространство имен anonymouse. Мне нравится, чтобы файлы .h были как можно более чистыми, чтобы уменьшить количество пересборок и файловых зависимостей.
Я считаю, что использование пространств имен anonymouse или помещение их в функцию помогает избежать конфликтов имен и приводит к более чистому коду.
Зависит от использования предиката. Поскольку вы говорите, что это бесполезно нигде, лучше объявить это в вашем файле cpp, чтобы не загромождать пространство имен, когда люди включают ваш заголовочный файл.
Если это даже не полезно в области видимости файла, вы можете рассмотреть возможность использования лямбд, если это не слишком сложно. В случае, если у вас нет доступа к лямбде C ++ 11 (или Boost.Lambda), вы можете объявить локальные функторы даже в области видимости функции. Это очень удобно! Однако помните, что вы не можете иметь шаблонные функторы на уровне области файла, что часто является тем, что вы хотели бы (хотя примером этого может быть использование «шаблонных итераторов»).
Если он предназначен для использования только одним классом, и вы не ожидаете, что он будет полезен для кого-то еще, это похоже на время для вложенного класса:
class SomeClass {
public:
//...
struct MyPredicate {
bool operator() (const SomeData&) const;
};
};
Фактическое название класса выше SomeClass::MyPredicate
так что если operator()
не определен при его объявлении, вам нужно определить SomeClass::MyPredicate::operator()
где-то. Но внутри любого члена SomeClass
Вы можете просто напечатать MyPredicate
,
Вы также можете сделать предикат private
член содержащего его класса, и в этом случае никакому внешнему коду не разрешается даже вводить имя этого класса.