Объявить участника -функция класса, объявленного вперед, как друга

Можно ли объявить функцию-член переданного класса как друга? Я пытаюсь сделать следующее:

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) не включать определение сложного класса для сокращения времени компиляции.

One подход может заключаться в добавлении класса, действующего как посредник:

// 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();
};

Однако это кажется немного неуклюжим ... так что я предполагаю, что должно быть лучшее решение!

13
задан hrr 10 June 2011 в 18:44
поделиться