Ich habe eine Klasse Bar, die Membervariablen einer Klasse Foo hält. Vereinfacht sieht das so aus:
Code: Alles auswählen
class Bar
{
Foo mFoo;
};
Entsprechend muss Bar.h Foo .h inkludieren und kann nicht einfach Foo via class Foo; vorraus deklarieren.
Nun benötigt aber eine Funktion aus Bar friend Zugriff auf Foo, während ich ungern auch dem ganze Rest von bar friend Zugriff auf Foo geben möchte.
Dummerweise muss nun aber Foo.h natürlich Bar.h inkludieren, damit ich eine Memberfunktion von Bar als Friend in Foo Angeben kann, einfach nur class Bar; eicht nur, wenn ich die ganze Klasse als friend angeben will, nicht bei einzelnen Funktionen.
Wie löse ich diese zirkulare Abhängigkeit nun ab besten auf?
Die beste Lösung, auf die ich bisher gekommen bin, ist dieser Pattern (Wenn das wirklich die beste Lösung ist, dann ist darauf bestimmt schon wer vor mir gekommen. Kann mir wer sagen, obs für den pattern einen konkreten Namen gibt?):
Code: Alles auswählen
class Foo;
class Bar;
class FooBar
{
static void friendOfFoo(void);
friend class Foo;
friend class Bar;
};
class Foo
{
friend void FooBar::friendOfFoo(void);
};
class Bar
{
friend void FooBar::friendOfFoo(void);
void friendOfFoo(void);
Foo mFoo;
};
Bei so etwas fundamentalem und primitiven muss es doch auch einfacher gehen?