Deklarieren Sie eine member-Funktion, eine vorwärts-deklarierte Klasse als Freund

Ist es möglich zu erklären, eine member-Funktion der vorwärts-deklarierte Klasse als Freund? Ich versuche, Folgendes zu tun:

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

So ist das Ziel, (i) die Einschränkung der friend-Deklaration auf eine einzige Methode, und (ii) nicht um die definition, die komplizierte Klasse zu reduzieren compile-Zeit.

Ein Ansatz sein könnte, um eine Klasse handeln als Vermittler:

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

Jedoch, dies scheint ein bisschen ungeschickt... also gehe ich davon aus, dass es eine bessere Lösung!

InformationsquelleAutor hrr | 2011-06-10
Schreibe einen Kommentar