Боюсь, что существует неправильное понимание того, что принадлежит классу, а что нет.
Не все методы, которые действуют на внутренние компоненты класса, должны быть методами класса, в конце концов, у нас уже есть friend
функции. Я знаю, что многие люди объявляют методы helper как частные функции, однако при этом возникают ненужные зависимости (время компиляции) и проблема видимости с friend
s.
При работе с PIMPL я не использую частные функции. Вместо этого выбор:
- Создание
Impl
(B
в вашем случае) истинным классом с собственной логикой проверки и истинным API
- Использование
static
свободных функций (или функций, объявленных в анонимном пространстве имен)
Оба хороши и используют то, что кажется наиболее подходящим. А именно:
- методы: при решении вопросов проверки
- свободные функции: для вычислений, которые могут быть выражены с помощью вышеупомянутых методов
С моей стороны намеренно искать как можно меньше методов, потому что это единственные, которые могут испортить мои классовые инварианты, и чем меньше они, тем увереннее я буду в том, что инварианты будут поддерживаться .
В вашем случае вам решать, какой подход вам больше подходит.
В действии:
a.cpp
#include <something_complicated.hpp>
struct B
{
something_complicated x;
}
static something_complicated& get_complicated(B& b) { return b_.x; }
// or anonymous namespace instead
namespace {
something_complicated& get_complicated(B& b) { return b_.x; }
}
Не так сильно отличается от того, что у тебя было, а?
Примечание: я предпочитаю статические функции анонимным пространствам имен, потому что это более очевидно при чтении. Пространства имен вводят области, и область видимости не легко просматривается при просмотре файла. Ваш пробег может отличаться, оба предлагают одинаковую функциональность (для функций).