Rumah > pembangunan bahagian belakang > C++ > Konflik antara fungsi rakan C++ dan kawalan akses

Konflik antara fungsi rakan C++ dan kawalan akses

王林
Lepaskan: 2024-04-16 18:09:01
asal
638 orang telah melayarinya

Dalam C++, fungsi rakan dan kawalan akses mungkin bercanggah. Untuk mengakses ahli persendirian, anda boleh mengisytiharkan ahli sebagai dilindungi atau menggunakan fungsi proksi. Sebagai contoh, kelas Pelajar mempunyai nama dan skor ahli peribadi, dan fungsi rakan printName dan printScore boleh mencetak ahli ini masing-masing.

C++ 友元函数与访问控制的冲突

C++ Fungsi Rakan dan Konflik Kawalan Akses

Dalam C++, fungsi rakan ialah fungsi bukan ahli yang boleh mengakses ahli peribadi kelas. Walau bagaimanapun, apabila ia berkaitan dengan kawalan akses, fungsi rakan mungkin menghadapi konflik dengan kawalan akses ahli kelas.

Kawalan Akses

C++ menyediakan tiga tahap kawalan akses:

  • awam: Boleh diakses dari mana-mana sahaja dalam kelas.
  • dilindungi: Hanya boleh diakses dari kelas dan kelas terbitannya.
  • peribadi: Hanya boleh diakses dari dalam kelas.

Fungsi rakan

Fungsi rakan diisytiharkan melalui kata kunci rakan. Fungsi rakan mempunyai akses kepada semua ahli kelas, tanpa mengira tahap kawalan akses. Walau bagaimanapun, fungsi rakan tidak menjadi sebahagian daripada kelas. friend 关键字声明的。友元函数可以访问类的所有成员,无论访问控制级别如何。但是,友元函数不会成为类的一部分。

访问控制冲突

当友元函数试图访问私有成员时,就会发生访问控制冲突。例如:

class MyClass {
private:
    int x;

friend void printX(MyClass& obj) {
    std::cout << obj.x << std::endl;
}
};
Salin selepas log masuk

在这个例子中,printX 函数是类的友元,但它试图访问私有成员 x。这会导致编译器错误。

解决冲突

要解决访问控制冲突,可以使用以下方法:

1. 使用保护成员

将私有成员声明为受保护成员。这允许派生类和友元函数访问该成员。

class MyClass {
protected:
    int x;

friend void printX(MyClass& obj) {
    std::cout << obj.x << std::endl;
}
};
Salin selepas log masuk

2. 使用代理函数

创建另一个类成员函数作为私有成员的代理。这个代理函数可以公开访问,供友元函数使用。

class MyClass {
private:
    int x;

public:
    int getX() const { return x; }

friend void printX(MyClass& obj) {
    std::cout << obj.getX() << std::endl;
}
};
Salin selepas log masuk

实战案例

在以下实际案例中,我们有一个 Student 类,它有 namescore两个私有成员。我们想要创建两个友元函数 printName()printScore()

Pelanggaran Kawalan Akses

Pelanggaran kawalan akses berlaku apabila fungsi rakan cuba mengakses ahli persendirian. Contohnya: 🎜
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;
}
};
Salin selepas log masuk
🎜Dalam contoh ini, fungsi printX ialah rakan kelas, tetapi ia cuba mengakses ahli peribadi x. Ini boleh menyebabkan ralat pengkompil. 🎜🎜🎜Menyelesaikan konflik🎜🎜🎜Untuk menyelesaikan konflik kawalan akses, anda boleh menggunakan kaedah berikut: 🎜🎜🎜1. Gunakan ahli yang dilindungi 🎜🎜🎜 untuk mengisytiharkan ahli persendirian sebagai ahli yang dilindungi. Ini membenarkan kelas terbitan dan fungsi rakan untuk mengakses ahli. 🎜
int main() {
    Student student;
    student.name = "John Doe";
    student.score = 95;

    printName(student);
    printScore(student);

    return 0;
}
Salin selepas log masuk
🎜🎜2. Gunakan fungsi proksi🎜🎜🎜 untuk mencipta satu lagi fungsi ahli kelas sebagai proksi untuk ahli persendirian. Fungsi proksi ini boleh diakses secara umum untuk digunakan oleh fungsi rakan. 🎜
Name: John Doe
Score: 95
Salin selepas log masuk
🎜🎜Kes praktikal🎜🎜🎜Dalam kes sebenar berikut, kami mempunyai kelas Pelajar, yang mempunyai dua peribadi: nama dan skor ahli. Kami ingin mencipta dua fungsi rakan printName() dan printScore() untuk mencetak ahli peribadi ini masing-masing. 🎜rrreee🎜Menggunakan fungsi rakan kita boleh mencetak nama dan gred pelajar dengan mudah walaupun mereka adalah ahli persendirian. 🎜rrreee🎜Output: 🎜rrreee

Atas ialah kandungan terperinci Konflik antara fungsi rakan C++ dan kawalan akses. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan