Можно ли объявить функцию-член объявленного вперед класса как друга? Я пытаюсь сделать следующее:
class BigComplicatedClass;
class Storage {
int data_;
public:
int data() { return data_; }
// OK, but provides too broad access:
friend class BigComplicatedClass;
// ERROR "invalid use of incomplete type":
friend void BigComplicatedClass::ModifyStorage();
};
Таким образом, цель состоит в том, чтобы (i) ограничивать объявление друга единственным методом и (ii) не включать определение сложного класса для сокращения времени компиляции.
Одним из подходов может быть добавление класса, действующего в качестве посредника:
// In Storage.h:
class BigComplicatedClass_Helper;
class Storage {
// (...)
friend class BigComplicatedClass_Helper;
};
// In BigComplicatedClass.h:
class BigComplicatedClass_Helper {
static int &AccessData(Storage &storage) { return storage.data_; }
friend void BigComplicatedClass::ModifyStorage();
};
Однако это кажется немного неуклюжим... поэтому я предполагаю, что должно быть лучшее решение!