Heim  >  Artikel  >  Backend-Entwicklung  >  Konflikt zwischen C++-Friend-Funktionen und Zugriffskontrolle

Konflikt zwischen C++-Friend-Funktionen und Zugriffskontrolle

王林
王林Original
2024-04-16 18:09:01635Durchsuche

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++ 友元函数与访问控制的冲突

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:

  • Öffentlich: Zugriff von überall in der Klasse.
  • geschützt: Der Zugriff ist nur über die Klasse und ihre abgeleiteten Klassen möglich.
  • privat: Nur innerhalb der Klasse zugänglich.

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 类,它有 namescore两个私有成员。我们想要创建两个友元函数 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: 🎜rrreee

Das 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn