Мне нужно обеспечить определенную операцию над элементами моего класса Foo
. Эта операция специфична и довольно странна, что я действительно не хочу, чтобы она была функцией-членом. С другой стороны, он работает на внутренностях класса, который я не хочу раскрывать.Конфликт между предоставлением (необязательной) функциональностью и инкапсуляцией?
Вот класс:
class Foo {
typedef std::map<int,double> VecElem;
std::vector<VecElem> vec_;
public:
void Insert(std::size_t index0, int index1, double d);
// ... other essential functions
};
void Foo::Insert(std::size_t index0, int index1, double d) {
vec_[index0][index1] = d;
}
Операцию мне нужно поддерживать, чтобы на карте index1
каждого элемента, вставленного до сих пор новый индекс, в соответствии с заданной старой к новой индексной карте:
void MapIndex1(const std::map<std::size_t,std::size_t>& old_to_new);
Учитывая то, как Foo
в настоящее время хранит свои элементы это означает полную перестройку внутренних данных, но это не должно подвергаться пользователю. Но и это не должно быть функцией-членом.
Это типичный случай функции, не входящей в функцию friend
? Есть ли другие возможности? Мне не очень нравится концепция функции non-member , потому что эта странная функция (которая может быть только временно необходима в качестве обходного пути для некоторой проблемы) все равно должна быть упомянута внутри «официального» класса (т.е. должен никогда не меняться). Но я думаю, я не могу обойти это?
Я бы не стал слишком беспокоиться о добавлении/удалении друга. Правило, что «официальное» тело класса никогда не должно меняться, вдохновлено тем, что интерфейс вашего класса никогда не должен меняться. Вы хотите временно изменить интерфейс, как взломать (хотя и только интерфейс через некоторую недокументированную функцию друга). Если это оправдано, то изменение тела класса оправдано. Если это не оправдано, тогда не планируйте временный взлом вообще: исправьте его правильно ... –