Ich zermartere mir gerade das Hirn, wie man ein bestimmtes Member einer Klasse für eine bestimmte andere Klasse / Funktion sichtbar macht …
private, protected und public funktionieren jeweils für ganze Sammlungen von Membern und machen diese für eine ganze Sammlung von anderen Objekten sichtbar.
friend ist schon spezieller, es macht Member nur für ein einziges anderes Objekt sichtbar. Aber es macht eben alle Member sichtbar, nicht nur das eine, das man braucht. (Und es hat ein paar Probleme mit Templates.)
Was ich brauche, ist eine Freundschaft für ein einzelnes Member. Leider kann ich das bisher nur über sehr hässliche Tricks realisieren …
… gibt es dafür eine saubere Lösung? („sauber“: ohne virtuelle Funktionen und ähnlichen Overhead, schließlich ist das ein Compile-Time-Problem.)
Gruß, Ky
Edit: Achja, in meinem Fall soll eine bestimmte Klasse nur von einer bestimmten Funktion ausgespuckt werden können (K’tor nur von jener Funktion aus abrufbar). Vielleicht hilft das. Hier ist meine bisherige Lösung:
Code: Alles auswählen
class Producer; // Produzent mit alleinigem Recht für die Herstellung des …
class Product; // … Produkts.
namespace {
// Alles, was nur …
class Product_ForProducer {
friend class Producer; // … für den Produzent sichtbar ist, …
private: // … und für niemand sonst – wie …
// … ein Konstruktor für ein Produkt.
static Product NamedConstructor();
};
}
// Das Produkt.
class Product
: public Product_ForProducer // Damit wird "NamedConstructor()" in diese Klasse übernommen, da Freundschaft zwar
// nicht vererbt werden kann, aber bei Vererbung für die Basisklasse erhalten bleibt.
{
private:
// Damit erhält der nur für den Produzenten sichtbare Teil der Klasse Zugriff auf den Konstruktor, und niemand sonst.
friend Product_ForProducer;
Product() { }
public:
// Zeug, das das Produkt kann. U.a. auch, dass es …
~Product() { } // … aufgebraucht wird.
};
// Kann nicht in "Product_ForProducer" definiert werden, da "Product" dort noch nicht definiert ist.
Product Product_ForProducer::NamedConstructor() {
return Product();
}
class Producer {
public:
static Product Produce() {
return Product::NamedConstructor();
}
};