Heim > Artikel > Backend-Entwicklung > Konflikt zwischen C++-Friend-Funktionen und Zugriffskontrolle
In C++ kann es zu Konflikten zwischen Friend-Funktionen und Zugriffskontrolle kommen. Um auf private Mitglieder zuzugreifen, können Sie das Mitglied als geschützt deklarieren oder eine Proxy-Funktion verwenden. Beispielsweise verfügt die Klasse „Student“ über den Namen und die Punktzahl privater Mitglieder, und die Freundfunktionen printName und printScore können diese Mitglieder jeweils drucken.
C++-Friend-Funktionen und Zugriffskontrollkonflikt
In C++ sind Friend-Funktionen Nicht-Member-Funktionen, die auf private Mitglieder einer Klasse zugreifen können. Wenn es jedoch um die Zugriffskontrolle geht, kann es bei Friend-Funktionen zu Konflikten mit der Zugriffskontrolle von Klassenmitgliedern kommen.
Zugriffskontrolle
C++ bietet drei Zugriffskontrollebenen:
Friend-Funktionen
Friend-Funktionen werden über das Schlüsselwort friend
deklariert. Friend-Funktionen haben Zugriff auf alle Mitglieder einer Klasse, unabhängig von der Zugriffskontrollebene. Friend-Funktionen werden jedoch nicht Teil der Klasse. friend
关键字声明的。友元函数可以访问类的所有成员,无论访问控制级别如何。但是,友元函数不会成为类的一部分。
访问控制冲突
当友元函数试图访问私有成员时,就会发生访问控制冲突。例如:
class MyClass { private: int x; friend void printX(MyClass& obj) { std::cout << obj.x << std::endl; } };
在这个例子中,printX
函数是类的友元,但它试图访问私有成员 x
。这会导致编译器错误。
解决冲突
要解决访问控制冲突,可以使用以下方法:
1. 使用保护成员
将私有成员声明为受保护成员。这允许派生类和友元函数访问该成员。
class MyClass { protected: int x; friend void printX(MyClass& obj) { std::cout << obj.x << std::endl; } };
2. 使用代理函数
创建另一个类成员函数作为私有成员的代理。这个代理函数可以公开访问,供友元函数使用。
class MyClass { private: int x; public: int getX() const { return x; } friend void printX(MyClass& obj) { std::cout << obj.getX() << std::endl; } };
实战案例
在以下实际案例中,我们有一个 Student
类,它有 name
和 score
两个私有成员。我们想要创建两个友元函数 printName()
和 printScore()
Verletzung der Zugriffskontrolle
Eine Verletzung der Zugriffskontrolle tritt auf, wenn eine Freundesfunktion versucht, auf ein privates Mitglied zuzugreifen. Zum Beispiel: 🎜class Student { private: std::string name; int score; friend void printName(Student& obj) { std::cout << "Name: " << obj.name << std::endl; } friend void printScore(Student& obj) { std::cout << "Score: " << obj.score << std::endl; } };🎜In diesem Beispiel ist die Funktion
printX
ein Freund der Klasse, versucht aber, auf das private Mitglied x
zuzugreifen. Dies kann Compilerfehler verursachen. 🎜🎜🎜Konflikte lösen🎜🎜🎜Um Zugriffskontrollkonflikte zu lösen, können Sie die folgenden Methoden verwenden: 🎜🎜🎜1. Verwenden Sie geschützte Mitglieder 🎜🎜🎜, um private Mitglieder als geschützte Mitglieder zu deklarieren. Dadurch können abgeleitete Klassen und Friend-Funktionen auf das Mitglied zugreifen. 🎜int main() { Student student; student.name = "John Doe"; student.score = 95; printName(student); printScore(student); return 0; }🎜🎜2. Verwenden Sie die Proxy-Funktion🎜🎜🎜, um eine weitere Klassenmitgliedsfunktion als Proxy für das private Mitglied zu erstellen. Diese Proxy-Funktion ist öffentlich zugänglich und kann von Friend-Funktionen verwendet werden. 🎜
Name: John Doe Score: 95🎜🎜Praktischer Fall🎜🎜🎜Im folgenden tatsächlichen Fall haben wir eine
Student
-Klasse, die zwei Privates hat: name
und score
Mitglied. Wir möchten zwei Freundfunktionen printName()
und printScore()
erstellen, um diese privaten Mitglieder jeweils zu drucken. 🎜rrreee🎜Mithilfe der Freundesfunktionen können wir ganz einfach die Namen und Noten der Schüler ausdrucken, auch wenn sie private Mitglieder sind. 🎜rrreee🎜Ausgabe: 🎜rrreeeDas obige ist der detaillierte Inhalt vonKonflikt zwischen C++-Friend-Funktionen und Zugriffskontrolle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!