Ich schreibe Code für den Zugriff auf private Mitglieder einer Klasse durch eine andere Freundesklasse. Der folgende Code funktioniertC++ Klasse Freundschaft
// Example program
#include <iostream>
#include <string>
using namespace std;
class Foo
{
private:
int a;
protected:
public:
friend class Bar;
Foo(int x)
{
a = x ;
}
};
class Bar
{
private:
protected:
public:
int b;
Bar(Foo& f)
{
b = f.a;
cout << "f.a is " << f.a << endl;
}
};
int main()
{
Foo foo(5);
Bar bar(foo);
cout << "Value of variable b is " << bar.b << endl;
}
Der obige Code funktioniert gut. Wenn ich jedoch auf eine private Variable von Foo
über eine Funktion in der Freundesklasse Bar
zugreifen möchte, kann ich dies nicht tun. Siehe Code unten
#include <iostream>
#include <string>
using namespace std;
class Foo
{
private:
int a;
protected:
public:
friend class Bar;
Foo(int x)
{
a = x ;
}
};
class Bar
{
private:
protected:
public:
int b;
Bar(Foo& f)
{
b = f.a;
}
void printvariable(void)
{
cout << "f.a is " << f.a << endl;
}
};
int main()
{
Foo foo(5);
Bar bar(foo);
cout << "Value of variable b is " << bar.b << endl;
}
ich völlig verstehen, warum die Ausführung auf der Funktion
void printvariable(void)
{
cout << "f.a is " << f.a << endl;
}
versagt, da f in ihrem Umfang nicht für die Funktion ist. Da ich jedoch Foo f
im Konstruktor für Bar b
übergebe, hoffe ich, Code zu schreiben, der es mir ermöglicht, auf Mitglieder in Foo
zuzugreifen, ohne Foo f
an die Funktion printvariable()
erneut zu übergeben.
Was ist der effizienteste Weg, diesen Code zu schreiben?
lange Geschichte kurz, Freundschaft ist schlecht. Tun Sie sich selbst einen Gefallen, halten Sie sich an die OOP-Prinzipien und die SOLID-Prinzipien (in diesem Fall die Verkapselung). Nicht jedes Sprachmerkmal muss verwendet werden, d. H. Goto. –
Fügen Sie eine Variable vom Typ 'Foo &' zu 'Bar' hinzu und der Konstruktor weist der Variablen' f' zu. Verwenden Sie dann die Elementvariable in 'printvariable'. – user4581301
@EyalPerry: Sie irren sich. Erfahren Sie mehr darüber http://www.stroustrup.com/bs_faq2.html#friend - eigentlich ist 'Freund' ein zusätzlicher, präziser, extrem feiner Zugriffsmodifikator. Es ermöglicht noch mehr Kapselung, weil es ein bestimmtes Ziel definiert, nicht wie öffentlich/geschützt, die eine unbegrenzte Anzahl von Stipendiaten erlauben. Bei der Kapselung geht es nicht darum, Dinge privat zu machen! Es geht darum, den Zugang zu denen einzuschränken, die es brauchen und von denen erwartet wird, dass sie es bekommen. – quetzalcoatl